在SQL中使用NOT EXISTS

时间:2013-12-15 23:20:43

标签: sql

如果表A具有int num且表B具有int q

以下两个查询是否始终给出相同的结果?

Q1:

select num
from A
where num>any(select q from B)

Q2:

select num
from A
where not exists(select * from B where num<=q);

谢谢

1 个答案:

答案 0 :(得分:2)

不,他们完全不同。第一个查找A记录,其中A.num大于某些 B.q;也就是说,如果任何 B.q小于给定的A.num,那么A.num将出现在结果中。第二个查找A记录,其中A.num大于所有 B.q s;也就是说,小于给定B.q的任何A.num,那么A.num出现在结果中。< / p>

假设第二个查询大概是您想要的,那么您应该在第一个查询中将ANY更改为ALL

然而,即便如此,也存在差异,因为它们以不同的方式处理空值:

  • 如果B.q永远为null,那么带有ALL的版本将永远不会返回任何行(因为null被认为是“未知”,因此可能是任意大的,{{1} }子句只接受已知符合条件的行),而WHERE的版本将忽略这些空值(因为它们被内部NOT EXISTS过滤掉了子句)。
  • 如果WHERE为null,则A.num版本将省略这些空值(因为它们被ALL子句筛选出来),而版本{{1}将包含它们(因为它们被内部 WHERE子句过滤掉了。)

编辑添加:正如dav1dsm1th暗示在上面的评论中,这假定NOT EXISTS没有任何名为WHERE的列。如果{{ 1}} 有一个名为B的列,那么num的版本实际上是指B而不是num,其行为与NOT EXISTS版本完全不同。可以通过在子查询中明确编写B.num而不是简单地A.num来解决此问题。)