当行存在时,“不在”和“在”的SQL 0结果

时间:2018-05-02 10:56:20

标签: sql sql-server select-query

我有一张表(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行。如何才能使值不在值列表中而不显示为相反的值?

我尝试过的事情:

  • 另外两位开发人员可以查看它。
  • ltrim(rtrim())同时选择两个值。
  • 各种char转换并将数字转换为int。

有没有人经历过这个?

3 个答案:

答案 0 :(得分:2)

不要将NOT IN与子查询一起使用。请改用NOT EXISTS

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

有什么区别?如果orderno中的任何 TableBNULL,则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

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