2011-05-21 90 views
1

我正在連接兩個數據庫進行數據遷移。我想檢查第二個數據庫中是否存在第一個數據庫表中的記錄。如何在SQL Server 2005中編寫INSERT IF NOT EXISTS查詢

I.e.從源數據庫用戶表我希望將數據遷移到目標數據庫用戶表。

如何使用if not exists來編寫查詢?

+0

哪個版本的標準SQL? 「合併」是標準SQL,但不受所有RDBMss – 2011-05-21 10:51:03

回答

2

SQL2003定義MERGE,否則你可以做一個INSERT INTO ... SELECT並在SELECT你應該LEFT JOIN使用在ON謂語自然鍵的目標表,然後就在WHERE <column> IS NULL卡盤。

+0

+1的支持,但看起來像現在編輯的問題是指SQL Server 2005而不是「標準SQL」 – 2011-05-21 10:56:56

+0

SQL Server 2005沒有MERGE命令。 ... – 2011-05-21 12:10:20

+0

我的答案不是特定於SQL Server的。 – 2011-05-22 00:47:12

4
insert into myTable 
select * from myOldTable ot 
where NOT EXISTS (select 1 from mytable t where t.ID = ot.ID) 

您可能會更好寫它作爲加入

insert into myTable 
select ot.* 
from myOldTable ot 
LEFT JOIN mtTable t 
ON ot.ID = t.ID 
WHERE t.ID IS NULL 

,或者根據您的數據庫,合併可能會更好,有很多的選擇

+0

這兩種情況都存在競爭條件的可能性,因此OP需要一個唯一的約束或額外的鎖定提示。 – 2011-05-21 10:57:29

+0

@Martin,你說得對,加上WITH(SERIALIZABLE,UPDLOCK)'應該可以解決這個問題,我相信 – 2011-05-21 11:02:58

+0

其實剛剛注意到Andomar的觀點,即這是爲了數據遷移,所以OP可能不需要擔心這一點。 – 2011-05-21 11:05:05

3

我發現下面的語法簡單閱讀:

insert TargetTable 
     (col1, col2) 
from SourceTable as source 
where not exists 
     (
     select * 
     from TargetTable as duplicate 
     where source.col1 = duplicate.col1 
       and source.col2 = duplicate.col2 
     ) 

通常,您不必擔心數據遷移過程中的併發性。如果這樣做,您可以指定鎖定提示,如with (tablock)或更高transaction isolation level。或者,您可以按照建議使用merge,但這有一個相當複雜的語法。

+0

謝謝andomar..this是我搜索的.. – ammu 2011-05-22 06:10:32

0
select * from db1.schema1.table1 
intersect 
select * from db2.schema2.table2 
+1

以及如何和在哪裏**插入**新行??? – 2011-05-21 12:10:47