我有两个关系a和b
表a
Name Age
------------
Arun 60
Shreya 24
Rohit 11
表b
Name Age
------------
Hari 40
Rohit 20
Karthik 18
select *
from A
where A.Age > all(select B.Age from B where B.Name = 'Arun');
我知道子查询将返回一个空集。我知道 all()
如果存在空集,则将考虑空值。在这种情况下,外部查询的where子句中的 predicate 应计算为unknown,从而消除from子句返回的所有元组。
但是,查询将从关系a返回所有元组作为输出。
请解释all()函数是如何处理空集的。
谢谢你的帮助!
1条答案
按热度按时间ie3xauqp1#
这个
ALL
就是照上面说的做。这是比较A.age
查询返回的每个值。过滤器通过,如果A.age
大于的所有值B.age
.没有值,所以这是真的。
您将空结果集与包含行的结果集混淆
NULL
. 这些是不同的东西。顺便说一句,我通常把这个逻辑写成:
在这种情况下,比较不是一个集合;与标量值进行比较。标量值是
NULL
因为子查询不返回任何行。因此,在这种情况下不返回任何行。当子查询返回任何行时,结果都是相同的。