2

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

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

基本问题是

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

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

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

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

返回一条记录,但

select * from tableB where CisAC = '336906210032'

才不是。

那么,什么给了?(感谢您的宝贵时间!)

4

3 回答 3

3

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

我会尝试

select * 
from tableA 
     left join tableB
     on convert(nvarchar(30),tableA.accountNum) = tableB.CisAC 
where tableB.CisAc is null
于 2012-10-04T15:33:10.270 回答
3

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

有关 SQL Fiddle,请参见此处:http ://sqlfiddle.com/#!6/dfb5d/1

可能发生的情况是您拥有tableB的数据与tableA.

编辑:

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

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

于 2012-10-04T15:33:46.297 回答
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 的回答建议替换查询应该可以解决问题。

于 2012-10-04T15:42:56.513 回答