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

Sql 是什么导致这些看似不一致的查询结果?,sql,sql-server,compare,match,record,Sql,Sql Server,Compare,Match,Record,我有一个问题让我很困惑。我有点希望你们中的一个会指出一些我忽略了的愚蠢错误,但我真的没看到 我有一个表,我们的生产过程已经提供了大约一年的时间,我们刚刚从客户那里得到了一些疯狂的表,我们正试图根据这些表匹配数据。在下面的查询中,tableA是我的表,tableB是我们刚刚导入的表 基本问题是 select * from tableA where convert(nvarchar(30),accountNum) not in ( select CisAC from

我有一个问题让我很困惑。我有点希望你们中的一个会指出一些我忽略了的愚蠢错误,但我真的没看到

我有一个表,我们的生产过程已经提供了大约一年的时间,我们刚刚从客户那里得到了一些疯狂的表,我们正试图根据这些表匹配数据。在下面的查询中,
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中的空值导致了中的
失败

我会试试看

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

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

请参见此处了解SQL FIDLE:

可能发生的情况是,您在
表B
中的数据与
表A
中的数据不匹配

编辑:

正如@Andomar所回答的,如果
tableB
有一个空值,那么查询将失败。请看这里:


这可能是经典的
错误。如果表B包含任何
null

where convert(nvarchar(30),accountNum) not in (
        select CisAC
        from tableB
    )
永远不会成功。你可以这样写:

where convert(nvarchar(30),accountNum) <> null and convert(nvarchar(30),accountNum) <> ...
其中convert(nvarchar(30),accountNum)为null,convert(nvarchar(30),accountNum)。。。
由于与
null
的任何比较结果均为
unknown
,因此该条件永远不会为真


join
替换查询,就像podiluska的回答所建议的那样,应该可以做到这一点。

如何修剪表B中的CisAC以删除前导和尾随空格?好主意,但不要空格。我还检查了len(CisAC)与DataLength(CisAC)的1/2不同的字段。