2016-12-16 69 views
2

我一直在尋找解決方案來實現最佳實現,如果該行已經存在,則不要插入。我已經閱讀了很多答案,這些答案在某種程度上有所不同,並且稍微超出了我的水平。SQL不插入重複項

例如下面的帖子是頂部的結果: SQL Server Insert if not exist 但我不明白爲什麼變量的使用和如何定義Table 1和表2。有人能夠進一步解釋這個問題嗎?這樣我就可以將它應用於我的情況了嗎?

在我的例子,我有大約5列(日期,數字1,數字,文本1,文本2),我想從表1插入到表2,但前提是不存在的。更新沒有必要。 (因此合併是出了問題)

+3

我們需要知道您的表結構(兩個表)來幫助你。樣本數據和您對「重複」的定義也是需要的。 – Siyual

回答

1

甲不存在使用相關子查詢應該工作。

子選擇標識表1中的所有記錄不表2中通過連接在所有我們會被插入的字段存在。這確保我們只插入表2中不存在的記錄。

INSERT INTO table2 (Date, Number1, Number2, Text1, Text2) 
VALUES 
    (SELECT A.Date, A.Number1, A.Number2, A.Text1, A.Text2 
     FROM Table1 A 
     WHERE NOT EXISTS (SELECT 1 
         FROM Table2 B 
         WHERE A.Date = B.Date 
          AND A.Number1 = B.Number1 
          AND A.Number2 = B.Number2 
          AND A.Text1 = B.Text1 
          AND A.Text2 = B.Text2)) 

由於我們不關心選擇什麼樣的價值,因爲它是從子查詢暴殄天物,我只是選擇1從不存在相關子查詢。

現在,如果有其他列需要考慮,那麼我們必須將這些列添加到我們的查詢中,或者如果主鍵可以考慮而不是所有列,那麼我們只需要加入它。

1

使用NOT EXISTS另一種,是使用了EXCEPT關鍵字做兩個結果集的數據之間的「差異化」,無論從Table1Table2選擇:

INSERT INTO table2 (Date, Number1, Number2, Text1, Text2) values 
SELECT A.Date, A.Number1, A.Number2, A.Text1, A.Text2 
FROM Table1 A 
EXCEPT 
SELECT B.Date, B.Number1, B.Number2, B.Text1, B.Text2 
FROM Table2 B;