2012-10-04 51 views
2

我有一个问题让我很困惑。我希望你们中的一个人指出我忽略的一些非常愚蠢的错误,但我真的没有看到它。什么导致这些看起来不一致的查询结果?

我有我们的生产工艺已被喂养像一年一个表,我们刚刚从我们的客户对我们试图匹配的数据一些疯狂的表。在以下查询中,tableA是我的表格,tableB是我们刚刚导入的表格。

的基本问题是,

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

没有返回任何记录时,我认为它应该是。我认为它应该在tableA中找到accountAum与tableB中的CisAC字段相匹配的任何记录。对? CisAC是一个nvarchar(30),我们的accountNum字段是bigint。

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

返回一个记录,但

select * from tableB where CisAC = '336906210032' 

并不:

为什么我觉得一个空返集是错误的指出。

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

+1

如何在表B微调CISAC除去开头和结尾的空白? –

+0

好主意,但没有空白。我还检查了len(CisAC)与1/2 DataLength(CisAC)不同的字段。 – clweeks

回答

2

这可能是经典的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,这种情况是不正确的。

更换了join像podiluska的答案查询建议应该做的伎俩。

+1

完美,谢谢! – clweeks

3

我怀疑是TableB中的空值导致IN失败

我会尝试

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

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

看到这里的SQL小提琴:http://sqlfiddle.com/#!6/dfb5d/1

什么是可能发生的事情是,你在tableB有数据不匹配tableA数据。

编辑:

由于@Andomar回答,如果tableB有一个空值,查询将失败。在这里看到:

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