我有一个问题,真的让我感到困惑。 我半期望你们中的一个人指出一些我忽略的非常愚蠢的错误,但我真的只是没有看到它。
我有一张表格,我们的生产过程已经提供了大约一年的时间,我们刚刚从客户那里得到了一些疯狂的表格,我们正试图根据这些表格来匹配数据。 在以下查询中,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
替换查询应该可以解决问题。