SQL 当行确实存在时 'Not In' 和 'In' 的结果为 0

SQL 0 results for 'Not In' and 'In' when row does exist

我有一个 table (A),其中包含订单号列表。它包含一行。

处理此订单后,应将其删除。但是,它无法删除。

我开始调查,为删除执行了一个非常简单的查询。

delete from table(A) where orderno not in (select distinct orderno from tableB)

订单号在tableB中绝对不存在。

我将 SSMS 中的查询更改为:

select * from table(A) where orderno not in (select distinct orderno from tableB)

这返回了 0 行。请记住,orderno 确实存在于 tableA 中。 然后我将查询从 "not in" 更改为 "In"。它仍然返回 0 行。一个值既不在值列表中又不显示相反值怎么可能?

我尝试过的事情:

有人遇到过吗?

您可以使用 not exists

select * 
from table(A) a
where not exists (selet 1 from tableB where orderno = a.orderno);

不要将 NOT IN 与子查询一起使用。使用 NOT EXISTS 代替:

delete from tableA 
    where not exists (select 1 from tableB where tableA.orderno = tableB.orderno);

有什么区别?如果TableB中的anyordernoNULL,则NOT INreturnsNULL。根据 SQL 中 NULL 的定义,这是正确的行为,但它违反直觉。 NOT EXISTS 为所欲为。

我也有过同样的经历。 尝试连接两个表 tableA 和 TableB

select * from TableA a  
inner join TableB b on a.orderno =b.orderno

这应该允许您获取记录,然后您可以删除它们。