【问题标题】:Merging table data without keys to join on合并没有键的表数据加入
【发布时间】:2014-07-16 14:22:05
【问题描述】:

我在 MS Sql Server 数据库中有两个表,从不同的来源导入,我想合并。

表1:

Id: int identity primary key  
Name: varchar(50)  
Code: varchar(50)

表1数据:

Id, Name, Code
1, 'Knife', '1'  
2, 'Spoon', '1'  
3, 'Fork', '1'  
...

表2:

Code: varchar(50)

表2数据:

Code
'ASF203RNSD2ONF'  
'FD042TOLFB0W30'  
'0FBW2REO90DFRK'  
...

我想用 Table2 的 Code 字段中的值更新 Table1 的 Code 字段。两个表的记录数相同,Table2 中的哪个代码进入 Table1 中的哪个记录并不重要,但 Table1 中的每条记录必须有一个来自 Table2 的唯一代码(Table2 中的每个代码值都是唯一的)。

通常我可以加入两个表中的 Id,但这里不是这种情况,并且 Table1 Id 不是连续的(一些记录已被删除)。

这样做的唯一方法是通过痛苦的行循环遍历记录行吗?

【问题讨论】:

    标签: sql sql-server-2008 join merge updates


    【解决方案1】:

    将行号添加到基表并加入其中。下面的代码有效。

    update t1
    set t1.code = t2.code
    from
    (select *, row_number() over(order by id) as rNum1  from table1) t1
    join 
    (select *, row_number() over(order by code) as rNum2 from table2) t2
    on t1.rnum1 = t2.rnum2
    

    【讨论】:

      【解决方案2】:

      如果每个表中的行数相同,并且哪个代码与哪个记录相对应并不重要,那么为什么不在子查询中使用行号创建任意键字段然后加入呢?

      SELECT
          TABLE1.ID,
          TABLE1.Name,
          TABLE2.Code
      
      FROM
          (SELECT ROW_NUMBER() OVER (ORDER BY ID) AS 'Key_Field', ID, Name, Code FROM Table1) TABLE1
      
          LEFT OUTER JOIN
          (SELECT ROW_NUMBER() OVER (ORDER BY Code) AS 'Key_Field', Code FROM Table2) TABLE2
          ON
          TABLE1.Key_Field = TABLE2.Key_Field
      

      【讨论】:

        【解决方案3】:

        如果记录数相等,并且更新的顺序不重要,您可以为两个表中的每条记录分配任意行号,然后匹配:

        WITH T1 AS
        (   SELECT  ID, 
                    Code,
                    RowNumber = ROW_NUMBER() OVER(ORDER BY (SELECT 1))
            FROM    Table1
        ), T2 AS
        (   SELECT  Code,
                    RowNumber = ROW_NUMBER() OVER(ORDER BY (SELECT 1))
            FROM    Table2
        )
        UPDATE  T1
        SET     Code = T2.Code
        FROM    T1
                INNER JOIN T2
                    ON T1.RowNumber = T2.RowNumber;
        

        【讨论】:

          猜你喜欢
          • 2011-08-09
          • 1970-01-01
          • 2012-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-05
          • 2019-01-28
          • 2021-08-22
          相关资源
          最近更新 更多