Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 合并无键联接的表数据_Sql_Sql Server 2008_Join_Merge_Updates - Fatal编程技术网

Sql 合并无键联接的表数据

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不是连续的(一些记录已被删除) 唯一的方法是一行一行地循环记录吗 将行号添加到基表中并在

我在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;