从另一个视图将行插入一个不存在的表中

时间:2016-04-15 10:34:10

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

我的问题与此极为相似: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中的所有记录以及Destite中找不到的那些记录的NULL值 - 这样可以正常工作。当我在底部添加WHERE子句时(即使只在一个条件下),它返回零值。

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

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

谢谢

2 个答案:

答案 0 :(得分:1)

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

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

如果您的目的地中有一个不可为空的列,您应该只能检查是否为NULL而不是检查多个列 - 如果表中有一个列,则主键是最好的选择。< / p>

答案 1 :(得分:0)

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

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