【问题标题】:Insert new records where one doesn't already exist在不存在的地方插入新记录
【发布时间】:2022-02-09 05:32:46
【问题描述】:

我需要一些帮助来插入不存在的新数据。

目前我使用这个查询:

INSERT INTO dbo.Table (column1, column2, column3, column4)
    SELECT value1, value2, value3, value4
    FROM dbo.staginTable
    LEFT JOIN dbo.Table AS A ON A.column1 = value1 
                             AND A.column2 = value2 
                             AND A.column3 = value3 
                             AND A.column4 = value4 
    WHERE A.column1 IS NULL 
      AND A.column2 IS NULL 
      AND A.column3 IS NULL 
      AND A.column4 IS NULL

如果没有变量 (value1, value2, value3, value4)空。

我的问题是它很常见,例如value3 或 value4 或两者都可以为空,在这种情况下,值将被插入

作品:

(value1, value2, value3, value4)
('one', 'two', 'three', 'four')

不起作用:

(value1, value2, value3, value4)
('one', 'two', NULL, 'four')

我知道我可以在 4 列上添加唯一索引来绕过这个问题,或者我可以使用像 insert expect 这样的另一个查询,但我想知道是否可以使用上面的查询或者我需要在查询中更改什么。

感谢您的帮助

【问题讨论】:

  • 听起来您需要使用exists 相关性。
  • 检查表的 NOT NULL 约束

标签: sql sql-server


【解决方案1】:

我建议使用NOT EXISTS- 因为这合乎逻辑。然后你需要结合你的NULL比较与值比较如下:

INSERT INTO dbo.MyTable (column1, column2, column3, column4)
    SELECT value1, value2, value3, value4
    FROM dbo.StagingTable ST
    WHERE NOT EXISTS (
      SELECT 1
      FROM dbo.MyTable MT
      WHERE (ST.value1 = MT.value1 OR (ST.value1 IS NULL AND MT.value1 IS NULL))
      AND (ST.value2 = MT.value2 OR (ST.value2 IS NULL AND MT.value2 IS NULL))
      AND (ST.value3 = MT.value3 OR (ST.value3 IS NULL AND MT.value3 IS NULL))
      AND (ST.value4 = MT.value4 OR (ST.value4 IS NULL AND MT.value4 IS NULL))
    );

【讨论】:

    【解决方案2】:

    鉴于您要比较的列都可以为空,EXCEPT 可以是更紧凑的形式

    INSERT INTO dbo.MyTable (column1, column2, column3, column4)
    SELECT ST.value1, ST.value2, ST.value3, ST.value4
        FROM dbo.StagingTable ST
    EXCEPT
    SELECT MT.value1, MT.value2, MT.value3, MT.value4
        FROM dbo.MyTable MT;
    

    或者,您可以在相关子查询中执行此操作,这在涉及未比较的其他列时特别有用

    INSERT INTO dbo.MyTable (column1, column2, column3, column4, column5)
        SELECT ST.value1, ST.value2, ST.value3, ST.value4, ST.value5
        FROM dbo.StagingTable ST
        WHERE NOT EXISTS (
          SELECT ST.value1, ST.value2, ST.value3, ST.value4
          INTERSECT
          SELECT MT.value1, MT.value2, MT.value3, MT.value4
          FROM dbo.MyTable MT
        );
    

    不要害怕:这个子查询是编译器的completely elided

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 1970-01-01
      • 2021-01-02
      • 2021-09-16
      • 2011-11-19
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      相关资源
      最近更新 更多