我有两个关系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()
如果存在空集,将考虑NULL值。在这种情况下,外部查询的where子句中的谓词应求值为UNKNOWN,从而消除了from子句返回的所有元组。
但是,查询正在返回关系A的所有元组作为输出。
请说明all()函数如何处理空集。
感谢您的帮助!
答案 0 :(得分:2)
ALL
完全按照它说的做。它将A.age
与查询返回的每个值进行比较。如果A.age
大于B.age
的所有值,则过滤器通过。
没有值,所以是真的。
您正在将一个空结果集与一个带有NULL
行的结果集混淆。这些是不同的东西。
顺便说一句,我通常将此逻辑写为:
select *
from A
where A.Age > (select max(B.Age) from B where B.Name = 'Arun');
在这种情况下,比较不是针对集合;比较是标量值。并且,标量值为NULL
,因为子查询不返回任何行。因此,在这种情况下,此操作不返回任何行。当您的子查询返回任何行时,结果都是相同的。