0

这是我的障碍。

我有两张桌子。表 A 包含比表 B 更多的行。我必须合并结果,如果表 A 不包含表 B 中的行,那么我将其插入到新集合中。但是,如果表 A 中的一行包含与表 B 具有相同主键的行,则新集合将采用表 B 中的行。

这最好在光标中完成还是有更简单的方法来做到这一点?我问是因为有 2000 万行,虽然我是 sql 新手,但我听说游标很昂贵。

4

3 回答 3

1

你的措辞有点含糊。您似乎想要 TableB 中的所有内容,然后是 TableA 中 B 中没有匹配主键的行。以下查询解决了这个问题:

select *
from tableB union all
select *
from tableA
where tableA.pk not in (select pk from tableB)
于 2013-02-19T17:39:07.527 回答
0

是的,游标很昂贵。

在更高版本的 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)
于 2013-02-19T17:38:41.063 回答
0

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
于 2013-02-19T17:47:52.257 回答