子查询的结果可以与自身结合吗?

时间:2012-05-28 01:34:12

标签: sql

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

(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的定义吗? (请不要讨论对表格设计的修改;我想关注使用子查询结果的问题。)

2 个答案:

答案 0 :(得分:2)

以下是with子句的链接。

Understanding the WITH Clause

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