2012-08-16 100 views
2

我想從一個表插入一些數據到另一個,但我想阻止插入重複的行。我目前以下查詢:防止使用SQL Server 2008插入重複行

INSERT INTO Table1 
(
    Table1Col1, 
    Table1Col2, 
    Table1Col3, 
    Table1Col4, 
    Table1Col5 
) 
SELECT 
    Table2Col1, 
    Table2Col2 = constant1, 
    Table2Col3 = constant2, 
    Table2Col4 = constant3, 
    Table2Col5 = constant4 
FROM Table2 
WHERE 
    Condition1 = constant5 
AND 
    Condition2 = constant6 
AND 
    Condition3 = constant7 
AND 
    Condition4 LIKE '%constant8%' 

什麼我不知道的是,我試圖從表2插入到表1的行可能已經存在,我想,以防止發生這種可能的重複和跳過插入然後轉到插入下一個唯一的行。

我已經看到我可以使用WHERE NOT EXISTS子句和INTERSECT關鍵字的使用,但我沒有完全理解如何將它應用於我的特定查詢,因爲我只想使用Table2中的一些選定數據,然後將一些常量值插入到Table1中。

編輯:

我要補充一點TableCol2通過對TableCol5實際上並不存在於結果集中的列,我只是填充這些列一起Table2Col1返回的。

+1

您可以在您的列上定義一個應該是唯一的'UNIQUE'約束 - 那麼沒有「重複」插入將工作(會導致錯誤代替) – 2012-08-16 10:47:54

+0

重複行一個與table1中的行完全相同或列的子集定義唯一性? – 2012-08-16 12:16:02

+0

@NikolaMarkovinović它是定義唯一性的Table1Col1,Table1Col2和TableCol3的子集。 – Aesir 2012-08-16 12:56:56

回答

1

Intersect(減去在SQL Server的術語)是沒問題的,因爲它比較整行。其他兩種選擇是not in/not exists/left joinmergeNot In僅適用於單列公鑰,因此在這種情況下不存在問題。 In/Exists/Left join應該在SQL Server中相同的性能,所以我就用存在:

INSERT INTO Table1 
(
    Table1Col1, 
    Table1Col2, 
    Table1Col3, 
    Table1Col4, 
    Table1Col5 
) 
SELECT 
    Table2Col1, 
    Table2Col2 = constant1, 
    Table2Col3 = constant2, 
    Table2Col4 = constant3, 
    Table2Col5 = constant4 
FROM Table2 
WHERE 
    Condition1 = constant5 
AND 
    Condition2 = constant6 
AND 
    Condition3 = constant7 
AND 
    Condition4 LIKE '%constant8%' 
AND NOT EXISTS 
    (
     SELECT * 
     FROM Table1 target 
     WHERE target.Table1Col1 = Table2.Table2Col1 
      AND target.Table1Col2 = Table2.Table2Col2 
      AND target.Table1Col3 = Table2.Table2Col3 
    ) 

Merge用於同步兩個表;它能夠插入,更新和刪除target table中的記錄。

merge into table1 as target 
using table2 as source 
    on target.Table1Col1 = source.Table2Col1 
    AND target.Table1Col2 = source.Table2Col2 
    AND target.Table1Col3 = source.Table2Col3 
when not matched by target then 
    insert (Table1Col1, 
      Table1Col2, 
      Table1Col3, 
      Table1Col4, 
      Table1Col5) 
    values (Table2Col1, 
      Table2Col2, 
      Table2Col3, 
      Table2Col4, 
      Table2Col5); 

如果從表2列傳輸過程中計算,在not exists()情況下,你可以使用派生表到位表2中,這同樣適用於merge例子 - 只需將您的查詢代替參考表2。

3

由於您在SQL Server 2008上,因此可以使用merge語句。

您可以輕鬆地檢查是否有行存在的基礎上的一個鍵

是這樣的:

merge TableMain AS target 
using TableA as source 
ON <join tables here> 
WHEN MATCHED THEN <update> 
WHEN NOT MATCHED BY TARGET <Insert> 
WHEN NOT MATCHED BY SOURCE <delete> 
+0

感謝迭戈,我對SQL比較陌生,您能否將您提供的更多合併示例與WHERE子句以及常量值的插入關聯起來? – Aesir 2012-08-16 10:56:39