3

假设我需要在每个动物园中找到最古老的动物。这是一种典型的最大组查询。只是这里有一个复杂之处:斑马和长颈鹿存储在不同的表中。要获得所有动物的列表,无论是长颈鹿还是斑马,我可以这样做:

(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? (请不要讨论对表设计的修改;我想集中讨论处理子查询结果的问题。)

4

2 回答 2

2

这是 with 子句的链接。

理解 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 创建为视图并在查询中使用它。

于 2012-05-28T01:39:45.723 回答
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
于 2012-05-28T01:51:23.930 回答