這是我的障礙。如何遍歷兩個表中的行並基於SQL中的合併結果創建新集
我有兩個表。表A包含比表B更多的行。我必須合併結果,並且如果表A不包含表B中的行,那麼我將它插入到新集中。但是,如果表A的一行包含與表B相同的主鍵,則新的集合將從表B的行取出。
這是否最好在遊標中完成或者是否有更簡單的方法做這個?我問,因爲有2000萬行,而我是新來的SQL,我聽說遊標是昂貴的。
這是我的障礙。如何遍歷兩個表中的行並基於SQL中的合併結果創建新集
我有兩個表。表A包含比表B更多的行。我必須合併結果,並且如果表A不包含表B中的行,那麼我將它插入到新集中。但是,如果表A的一行包含與表B相同的主鍵,則新的集合將從表B的行取出。
這是否最好在遊標中完成或者是否有更簡單的方法做這個?我問,因爲有2000萬行,而我是新來的SQL,我聽說遊標是昂貴的。
你的措辭是有點含糊。看來,你想從表B一切,然後從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)
外連接應該做你需要什麼,比一個更有效光標。 試試這個查詢
--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