2017-10-05 89 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

相关问题