假设我需要找到每个动物园里最古老的动物。这是一种典型的最大组查询。只有这里是复杂的:斑马和长颈鹿存储在单独的表中。要获得所有动物的列表,无论是长颈鹿还是斑马,我都可以这样做:
(SELECT id,zoo,age FROM zebras
UNION ALL
SELECT id,zoo,age FROM giraffes) t1
然后给出t1
,我可以建立一个典型的最大组查询:
SELECT t1.*
FROM t1
JOIN
(SELECT zoo,max(age) as max_age
FROM t1
GROUP BY zoo) t2
ON (t1.zoo = t2.zoo)
显然,我可以将t1
存储为临时表,但有一种方法可以在一个查询中完成所有操作,而无需重复t1
的定义吗? (请不要讨论对表格设计的修改;我想关注使用子查询结果的问题。)
答案 0 :(得分:2)
以下是with子句的链接。
with t1 as
(select id, zoo, age from zebras
union all
select id, zoo, age from giraffes)
select t1.*
from t1
join
(SELECT zoo,max(age) as max_age
FROM t1
GROUP BY zoo) t2
on (t1.zoo = t2.zoo);
注意:你也可以将t2移到你的with子句中。
注2:另一种解决方案是简单地将t1创建为视图,并在查询中使用它。
答案 1 :(得分:0)
要找到最老的动物,你应该使用wjndoq函数:
select z.*
from (select z.*,
row_number() over (partition by zoo order by age desc) as seqnum
from ( <subquery to union all animals>) z
)
where seqnum = 1