2013-02-19 42 views
0

這是我的障礙。如何遍歷兩個表中的行並基於SQL中的合併結果創建新集

我有兩個表。表A包含比表B更多的行。我必須合併結果,並且如果表A不包含表B中的行,那麼我將它插入到新集中。但是,如果表A的一行包含與表B相同的主鍵,則新的集合將從表B的行取出。

這是否最好在遊標中完成或者是否有更簡單的方法做這個?我問,因爲有2000萬行,而我是新來的SQL,我聽說遊標是昂貴的。

回答

1

你的措辭是有點含糊。看來,你想從表B一切,然後從TableA的行已在B.沒有匹配的主鍵下面的查詢解決了這個問題:

select * 
from tableB union all 
select * 
from tableA 
where tableA.pk not in (select pk from tableB) 
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) 
0

外連接應該做你需要什麼,比一個更有效光標。 試試這個查詢

--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 
相關問題