这是我的障碍。
我有两张桌子。表 A 包含比表 B 更多的行。我必须合并结果,如果表 A 不包含表 B 中的行,那么我将其插入到新集合中。但是,如果表 A 中的一行包含与表 B 具有相同主键的行,则新集合将采用表 B 中的行。
这最好在光标中完成还是有更简单的方法来做到这一点?我问是因为有 2000 万行,虽然我是 sql 新手,但我听说游标很昂贵。
这是我的障碍。
我有两张桌子。表 A 包含比表 B 更多的行。我必须合并结果,如果表 A 不包含表 B 中的行,那么我将其插入到新集合中。但是,如果表 A 中的一行包含与表 B 具有相同主键的行,则新集合将采用表 B 中的行。
这最好在光标中完成还是有更简单的方法来做到这一点?我问是因为有 2000 万行,虽然我是 sql 新手,但我听说游标很昂贵。
你的措辞有点含糊。您似乎想要 TableB 中的所有内容,然后是 TableA 中 B 中没有匹配主键的行。以下查询解决了这个问题:
select *
from tableB union all
select *
from tableA
where tableA.pk not in (select pk from tableB)
是的,游标很昂贵。
在更高版本的 SQL 中有一个MERGE
命令可以一次性完成,但是太麻烦了。最好分两部分进行 - 首先:
UPDATE A SET
field1 = B.field1
,field2 = B.field2
, etc
FROM A JOIN B on B.id = A.id
然后:
INSERT A SELECT * FROM B --enumerate fields if different
WHERE B.id not in (select id FROM A)
OUTER JOIN 应该做你需要的,并且比游标更有效。试试这个查询
--first get the rows that match between TableA and TableB
INSERT INTO [new set]
SELECT TableB.* --or columns of your choice
FROM TableA LEFT JOIN TableB ON [matching key criteria]
WHERE TableB.[joining column/PK] IS NOT NULL
--then get the rows from TableA that don't have a match
INSERT INTO [new set]
SELECT TableA.* --you didn't say what was inserted if there was no matching row
FROM TableA LEFT JOIN TableB ON [matching key criteria]
WHERE TableB.[joining column/PK] IS NULL