我有一张表(A),其中包含订单号列表。它包含一行。
处理完此订单后,应将其删除。但是,它无法删除。
我开始调查,对删除执行了一个非常简单的查询。
delete from table(A) where orderno not in (select distinct orderno from tableB)
表B中绝对不存在订单号。
我将SSMS中的查询更改为:
select * from table(A) where orderno not in (select distinct orderno from tableB)
这返回0行。请记住orderA中确实存在orderno。 然后我将查询从“not in”更改为“In”。它仍然返回0行。如何才能使值不在值列表中而不显示为相反的值?
我尝试过的事情:
有没有人经历过这个?
答案 0 :(得分:2)
不要将NOT IN
与子查询一起使用。请改用NOT EXISTS
:
delete from tableA
where not exists (select 1 from tableB where tableA.orderno = tableB.orderno);
有什么区别?如果orderno
中的任何 TableB
为NULL
,则NOT IN
会返回NULL
。这是基于SQL中如何定义NULL
的正确行为,但它是违反直觉的。 NOT EXISTS
做你想做的事。
答案 1 :(得分:1)
您可以使用not exists
select *
from table(A) a
where not exists (selet 1 from tableB where orderno = a.orderno);
答案 2 :(得分:0)
我也经历过同样的事情。 尝试加入两个表tableA和TableB
select * from TableA a
inner join TableB b on a.orderno =b.orderno
这应该允许您获取记录,然后您可以删除它们。