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不同的字段。