是什么导致了这些看似不一致的查询结果



我有一个问题,真的让我感到困惑。 我半期望你们中的一个人指出一些我忽略的非常愚蠢的错误,但我真的只是没有看到它。

我有一张表格,我们的生产过程已经提供了大约一年的时间,我们刚刚从客户那里得到了一些疯狂的表格,我们正试图根据这些表格来匹配数据。 在以下查询中,tableA是我的表,tableB是我们刚刚导入的表。

基本问题是

select *
from tableA
where convert(nvarchar(30),accountNum) not in (
        select CisAC
        from tableB
    )

在我认为应该返回任何记录时没有返回任何记录。 我认为它应该在表 A 中找到任何记录,其中 accountNum 与表 B 中的 CisAC 字段匹配。 右? CisAC 是一个 nvarchar(30),我们的 accountNum 字段是一个 bigint。

指出为什么我认为空返回集是错误的:

select * from tableA where convert(nvarchar(30),accountNum) = '336906210032'

返回一条记录,但

select * from tableB where CisAC = '336906210032'

不。

那么,什么给了呢? (谢谢你的时间!

我怀疑表B中的空值会导致IN失败

我会尝试

select * 
from tableA 
     left join tableB
     on convert(nvarchar(30),tableA.accountNum) = tableB.CisAC 
where tableB.CisAc is null

您的查询是正确的。它返回预期的结果。

有关 SQL 小提琴:http://sqlfiddle.com/#!6/dfb5d/1,请参阅此处

可能发生的情况是,您在tableB中的数据与tableA中的数据不匹配。

编辑:

正如@Andomar回答的那样,如果tableB具有空值,则查询将失败。看这里:

http://sqlfiddle.com/#!6/05bb1/1

这可能是

经典的not in错误。 如果表 B 包含任何null值,

where convert(nvarchar(30),accountNum) not in (
        select CisAC
        from tableB
    )

永远不会成功。 你可以这样写出来:

where convert(nvarchar(30),accountNum) <> null and convert(nvarchar(30),accountNum) <> ...

因为任何与null的比较都计算为unknown,这个条件永远不会成立。

用像podiluska的答案这样的join替换查询应该可以解决问题。

相关内容

  • 没有找到相关文章

最新更新