2017-10-05 87 views
-1

我需要將多行插入到表中。我通過選擇另一個表中的行並將它們插入到所需的表中來完成此操作。SQL Server:如果不存在多個

問題是我需要插入的一行或兩行可能已經存在。如何在插入許多行的插入上執行IF NOT EXISTS,如下例所示:

BEGIN TRAN 
    INSERT INTO [main].[dbo].[product_usa] 
     SELECT * 
     FROM [main].[dbo].[product_mxo] 
     WHERE tag_key IN ('15652', '16161', '11431', '16214', '16215', '16216', 
          '16213', '16217', '16218', '16222') 
      AND edition_key = '1' 
      AND product_key = '1' 
-- COMMIT 
-- ROLLBACK 

回答

0

如果tag_key是PK中都product_usaproduct_mxo只需要添加exists驗證tag_key已不存在。

INSERT INTO [main].[dbo].[product_usa] 
    SELECT * 
    FROM [main].[dbo].[product_mxo] mxo 
    WHERE tag_key IN 
     ('15652', '16161', '11431', 
     '16214', '16215', '16216', 
     '16213', '16217', '16218', 
     '16222') 
    AND edition_key = '1' 
    AND product_key = '1' 
    AND NOT EXISTS (SELECT 1 
        FROM [main].[dbo].[product_usa] usa 
        WHERE us.tag_key = mxo.tag_key) 
+0

0行受到影響。我不知道如何擴大這一點,但有一些行應該受到影響。 – John

+0

查詢看起來沒問題。試試'SELECT * FROM [main]。[dbo]。[product_usa] usa WHERE tag_key IN ('15652','16161','11431', '16214','16215','16216', '16213 ','16217','16218', '16222')'帶來什麼結果?然後用'mxo'做同樣的工作 –

+0

這兩個表的選擇都正常工作 – John

0

您可以像這樣添加EXISTS

BEGIN TRAN 
INSERT INTO [main].[dbo].[product_usa] 
    SELECT * 
    FROM [main].[dbo].[product_mxo] 
    WHERE tag_key IN 
    (
     '15652', 
     '16161', 
     '11431', 
     '16214', 
     '16215', 
     '16216', 
     '16213', 
     '16217', 
     '16218', 
     '16222' 
    ) AND edition_key = '1' AND product_key = '1' 
    AND NOT EXISTS(SELECT * FROM [main].[dbo].[product_usa] WHERE /* Column Comparison */) 
0

假設tag_key是你可以做這樣的事情的主要或唯一鍵:

INSERT INTO [main].[dbo].[product_usa] 
    SELECT * 
    FROM [main].[dbo].[product_mxo] t 
    WHERE tag_key IN 
    (
     '15652', 
     '16161', 
     '11431', 
     '16214', 
     '16215', 
     '16216', 
     '16213', 
     '16217', 
     '16218', 
     '16222' 
    ) AND edition_key = '1' AND product_key = '1' 
    AND NOT EXISTS (SELECT 1 FROM [main].[dbo].[product_usa] x WHERE t.tag_key = x.tag_key) 

如果你想不存在的只是擺脫你的其他地方條件的所有記錄

INSERT INTO [main].[dbo].[product_usa] 
    SELECT * 
    FROM [main].[dbo].[product_mxo] t 
    WHERE 
     NOT EXISTS (SELECT 1 FROM [main].[dbo].[product_usa] x WHERE t.tag_key = x.tag_key) 
+0

與@juan解決方案相同,0行受到影響。 – John

+0

@約翰是的,他和我同時回答,但他們不完全一樣的答案。閱讀他的回答評論,你應該考慮我的答案的第二部分。但是你需要解釋你想要的是什麼。比如「我試圖將每行從product_mxo插入到product_usa」中,而不存在主鍵的是tag_key或另一列。或者我試圖同步這些表格,或者我試圖插入符合xyz標準且不存在的每個產品....如果您無法獲得想要的結果,那麼您可能會過濾掉過多的結果或不正確的地方 – Matt

0

用tag_key上的目標表執行左外連接並檢查是否爲空。

INSERT INTO [main].[dbo].[product_usa] 
SELECT m.* 
FROM [main].[dbo].[product_mxo] m 
LEFT OUTER JOIN [main].[dbo].[product_usa] u 
ON u.tag_key = m.tag_key 
WHERE m.tag_key IN 
(
    '15652', 
    '16161', 
    '11431', 
    '16214', 
    '16215', 
    '16216', 
    '16213', 
    '16217', 
    '16218', 
    '16222' 
) AND m.edition_key = '1' AND m.product_key = '1' AND u.tag_key IS NULL 
+0

對不起......你問關於不存在。雖然我的回答將解決您所描述的問題,但它並未使用您詢問的工具。我的錯... – SQLCliff

相關問題