如果表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);
谢谢
答案 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
来解决此问题。)