考虑像
这样的架构create table world
(
name varchar(255),
continent varchar(255),
area varchar(255)
);
insert into world values("Germany", "Europe", 20);
insert into world values("France", "Europe", 10);
insert into world values("Russia", "Europe", 30);
insert into world values("China", "Asia", 10);
insert into world values("Japan", "Asia", 20);
然后执行此查询
select name, continent, area
from world t1
where area >= all (select area
from world t2
where t1.continent = t2.continent);
将列出每个大洲按面积最大的国家/地区。
这是sql fiddle http://sqlfiddle.com/#!9/a66aee/4/0
我从 article 中理解的是,它处理每个外部行,然后继续进行内部查询。
如果我的理解是正确的,那么
第一个外行的,
name = Germany, continent= Europe, area = 20
内部查询看起来像
select area from world t2 where t2.continent = "Europe";
会返回这样的区域:
20
10
30
然后外部查询将检查
if t1.area >= 20, 10 and 30 .....(t1.area = 20)
应返回20 and 30
。
如果是这种情况,那么它是否应该返回行:
"Germany", "Europe", 20
"Russia", "Europe", 30
如果这不对,那么SQL如何处理相关查询?
答案 0 :(得分:1)
嗯,你理解基础知识,但不是结局。
是的,查询将如何处理,除了这部分:
if t1.area >= 20, 10 and 30 .....(t1.area = 20)
您的查询检查现在t1.area
的当前20
是否大于ALL
子查询中提供的值,该行的值为(10,20,30)
。
由于20
小于30
,因此此条件为FALSE
,因此外部查询中的此行将被过滤。
对于Europe
,只应返回区域30
,因为它是唯一比所有子查询结果30>= 10 && 30>= 20 && 30>= 30