【问题标题】:SQL do not insert duplicatesSQL 不插入重复项
【发布时间】:2017-05-02 09:03:02
【问题描述】:

我一直在寻找一种解决方案,以最好地实现如果该行已存在则不要插入。我已经阅读了很多答案,这些答案在某些方面有所不同,这比我的水平略高一点。

例如,以下帖子是最高结果: SQL Server Insert if not exist 但我不明白为什么要使用这些变量以及如何定义 table1 和 table2。有人可以进一步解释一下,以便我可以将其应用于我的情况吗?

在我的示例中,我想将大约 5 列(日期、编号 1、编号 2、文本 1、文本 2)从 table1 插入到 table2,但前提是它们不存在。不需要更新。 (因此合并是不可能的)

【问题讨论】:

  • 我们需要了解您的表结构(两个表的)以帮助您。还需要样本数据和您对“重复”的定义。

标签: sql sql-server exists not-exists


【解决方案1】:

不存在应该使用相关的子查询。

子选择通过连接我们将要插入的所有字段来识别 Table1 中不存在于 Table2 中的所有记录。这确保我们只插入 table2 中不存在的记录。

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。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-12-19
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2016-02-19
      相关资源
      最近更新 更多