Sql 合并无键联接的表数据
我在MS Sql Server数据库中有两个表,它们是从不同来源导入的,我想合并它们 表1: 表1数据: 表2: 表2数据: 我想用表2的代码字段中的值更新表1的代码字段。两个表都有相同数量的记录,表2中的哪个代码进入表1中的哪个记录并不重要,但表1中的每个记录都必须有一个来自表2的唯一代码(表2中的每个代码值都是唯一的) 通常情况下,两个表中都会有一个Id,我可以加入其中,但这里不是这样,Table1 Id不是连续的(一些记录已被删除)Sql 合并无键联接的表数据,sql,sql-server-2008,join,merge,updates,Sql,Sql Server 2008,Join,Merge,Updates,我在MS Sql Server数据库中有两个表,它们是从不同来源导入的,我想合并它们 表1: 表1数据: 表2: 表2数据: 我想用表2的代码字段中的值更新表1的代码字段。两个表都有相同数量的记录,表2中的哪个代码进入表1中的哪个记录并不重要,但表1中的每个记录都必须有一个来自表2的唯一代码(表2中的每个代码值都是唯一的) 通常情况下,两个表中都会有一个Id,我可以加入其中,但这里不是这样,Table1 Id不是连续的(一些记录已被删除) 唯一的方法是一行一行地循环记录吗 将行号添加到基表中并在
唯一的方法是一行一行地循环记录吗 将行号添加到基表中并在此基础上加入。下面的代码可以工作
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
将行号添加到基表并在此基础上联接。下面的代码可以工作
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
如果每个表中的行数相同,并且哪个代码与哪个记录对应并不重要,那么为什么不在子查询中使用行数创建任意键字段,然后在该字段上进行联接呢
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
如果每个表中的行数相同,并且哪个代码与哪个记录对应并不重要,那么为什么不在子查询中使用行数创建任意键字段,然后在该字段上进行联接呢
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
如果记录数相等,且更新顺序不重要,则可以为两个表中的每条记录指定任意行号,然后进行匹配:
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;
如果记录数相等,且更新顺序不重要,则可以为两个表中的每条记录指定任意行号,然后进行匹配:
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;
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;