【问题标题】:Insert Rows into One Table that Don't Exist, from Another View从另一个视图将行插入一个不存在的表中
【发布时间】:2016-08-07 06:54:38
【问题描述】:

我的问题与此极为相似:Select rows which are not present in other table

但不同之处在于我是从一个视图而不是另一个表中检索数据。但是,子选择查询不返回任何记录,我省略了 INSERT INTO 来测试 SELECT 查询

这是我目前得到的:

SELECT SourceT.*, DestT.Column1, DestT.Column2
FROM
    ViewA SourceT
LEFT OUTER JOIN
    TableA DestT
ON
    SourceT.Column1 = DestT.Column1 AND
    SourceT.Column2 = DestT.Column2 AND
    SourceT.Column3 = DestT.Column3 AND

**** 到这里为止一切正常

WHERE
    DestT.Column1 = NULL AND
    DestT.Column2 = NULL AND
    DestT.Column3 = NULL

如果我忽略 WHERE 条件,它将返回 SourceT 中的所有记录以及 DestT 中未找到的那些记录的 NULL 值 - 这很好用。当我在底部添加 WHERE 子句时(即使只有一个条件),它返回零值。

我可以尝试 DestT.Column1 = NULL,或 DestT.Column1 NULL - 仍然没有返回任何内容。我的查询正确返回 NULL 值,但 WHERE 条件不起作用,或不允许任何数据通过。

知道这里发生了什么吗?本质上,我正在尝试根据许多条件将视图中的行插入到它们尚不存在的 TableA 中。

谢谢

【问题讨论】:

  • 有人吗?我还尝试将条件 DestT.Column1 = NULL 添加到 LEFT JOIN 但没有运气:/
  • 我让它在没有内部联接的情况下工作并添加以下内容: WHERE NOT EXISTS (SELECT * FROM Table! WHERE ... 条件) 但是该死的查询很慢@ 10,000 条记录仅超过 2 分钟在每个表中?

标签: sql-server select left-join outer-join


【解决方案1】:

在比较中将 = 更改为 IS,NULL 的处理方式略有不同:

WHERE
DestT.Column1 IS NULL AND
DestT.Column2 IS NULL AND
DestT.Column3 IS NULL

如果您的目标中有一个不可为空的列,您应该能够检查该列是否为 NULL,而不是检查多个列 - 如果表有一个主键,那么主键将是您的最佳选择。

【讨论】:

  • 好东西,可惜我没有多注意。这也使我的查询时间达到非常可接受的 4 秒。荣誉:)
【解决方案2】:

正确的语法是“IS NULL”,而不是“= NULL”。

WHERE
    DestT.Column1 IS NULL AND
    DestT.Column2 IS NULL AND
    DestT.Column3 IS NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多