我在MS Sql Server数据库中有两个表,从不同的源导入,我想要合并。
Id: int identity primary key
Name: varchar(50)
Code: varchar(50)
Id, Name, Code
1, 'Knife', '1'
2, 'Spoon', '1'
3, 'Fork', '1'
...
Code: varchar(50)
Code
'ASF203RNSD2ONF'
'FD042TOLFB0W30'
'0FBW2REO90DFRK'
...
我想用表2&#39代码字段中的值更新Table1&#39的代码字段。两个表都有相同数量的记录,表2中的哪些代码进入Table1的哪条记录并不重要,但Table1中的每条记录都必须有来自Table2的唯一代码(Table2中的每个代码值都是唯一的)
通常情况下,我可以加入两个表中的 Id ,但这不是这种情况,而且Table1 Id不是连续的(某些记录有被删除了。)
这样做的唯一方法是通过痛苦的行来循环记录行吗?
答案 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;