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、一時テーブルとして保存できますが、これをすべて 1 つのクエリ内で、定義を繰り返すことなく実行できる方法はあります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 に答える