SQL不插入重复项

问题描述:

我一直在寻找解决方案来实现最佳实现,如果该行已经存在,则不要插入。我已经阅读了很多答案,这些答案在某种程度上有所不同,并且稍微超出了我的水平。SQL不插入重复项

例如下面的帖子是顶部的结果: SQL Server Insert if not exist 但我不明白为什么变量的使用和如何定义Table 1和表2。有人能够进一步解释这个问题吗?这样我就可以将它应用于我的情况了吗?

在我的例子,我有大约5列(日期,数字1,数字,文本1,文本2),我想从表1插入到表2,但前提是不存在的。更新没有必要。 (因此合并是出了问题)

+3

我们需要知道您的表结构(两个表)来帮助你。样本数据和您对“重复”的定义也是需要的。 – Siyual

甲不存在使用相关子查询应该工作。

子选择标识表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从不存在相关子查询。

现在,如果有其他列需要考虑,那么我们必须将这些列添加到我们的查询中,或者如果主键可以考虑而不是所有列,那么我们只需要加入它。

使用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;