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 行。一个值既不在值列表中又不显示相反值怎么可能?
我尝试过的事情:
- 另外两位开发人员查看它。
- ltrim(rtrim()) 在两个 select 值上。
- 各种字符转换并将数字转换为 int。
有人遇到过吗?
您可以使用 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
中的anyorderno
是NULL
,则NOT IN
returnsNULL
。根据 SQL 中 NULL
的定义,这是正确的行为,但它违反直觉。 NOT EXISTS
为所欲为。
我也有过同样的经历。
尝试连接两个表 tableA 和 TableB
select * from TableA a
inner join TableB b on a.orderno =b.orderno
这应该允许您获取记录,然后您可以删除它们。
我有一个 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 行。一个值既不在值列表中又不显示相反值怎么可能?
我尝试过的事情:
- 另外两位开发人员查看它。
- ltrim(rtrim()) 在两个 select 值上。
- 各种字符转换并将数字转换为 int。
有人遇到过吗?
您可以使用 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
中的anyorderno
是NULL
,则NOT IN
returnsNULL
。根据 SQL 中 NULL
的定义,这是正确的行为,但它违反直觉。 NOT EXISTS
为所欲为。
我也有过同样的经历。 尝试连接两个表 tableA 和 TableB
select * from TableA a
inner join TableB b on a.orderno =b.orderno
这应该允许您获取记录,然后您可以删除它们。