合并没有要加入的键的表数据

时间:2014-07-16 14:22:05

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

我在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'  
...

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

通常情况下,我可以加入两个表中的 Id ,但这不是这种情况,而且Table1 Id不是连续的(某些记录有被删除了。)

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

3 个答案:

答案 0 :(得分:3)

在基表中添加行号并加入其中。以下代码有效。

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

答案 1 :(得分: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

答案 2 :(得分:1)

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

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;