一般的なテーブル式 を使用できます。 コードの重複を避けるために:
with cte_s as(select id_movie、count(id_movie)as Awards from Award natural join Awardwinner where Award_year =2012 group by id_movie)select sub.id_movie、sub.awardsfrom cte_s as subwhere sub.awards =(select max (sub2.awards)from cte_s as sub2)
または、ウィンドウ関数 を使用してこのようなことを行うことができます。 (テストされていませんが、PostgreSQLではこれが可能だと思います):
with cte_s as(select id_movie、count(id_movie)as Awards、max(count(id_movie))over()as max_awards from Award natural join Awardwinner where Award_year =2012 group by id_movie)select id_moviefrom cte_swhere max_awards =賞
これを行う別の方法は、rank()> 関数(テストされていない、1つではなく2つのcteを使用する必要があるかもしれません):
with cte_s as(select id_movie、count(id_movie)as Awards、rank()over(order by count(id_movie)desc)as rnk from Award natural join Awardwinner where Award_year =2012 group by id_movie)select id_moviefrom cte_swhere rnk =1
更新 この回答を作成したときの私の主な目標は、cteを使用してコードの重複を回避する方法を示すことでした。一般的には、可能であれば、クエリでcteを複数回使用することは避けたほうがよいでしょう。最初のクエリは2つのテーブルスキャン(またはインデックスシーク)を使用し、2番目と3番目は1つだけを使用するので、これらのクエリ。とにかく、@Erwinは彼の答えでこのテストを行いました。彼の大きな主なポイントに追加するだけです:
自然結合
にも反対するアドバイスをします これはエラーが発生しやすい性質のためです。実際、私のメインのRDBMSはSQL Serverであり、サポートされていないため、外部/内部結合
を明示することに慣れています。 。- クエリでは常にエイリアスを使用することをお勧めします。これにより、奇妙な結果 。
- これは完全に主観的なことかもしれませんが、通常、クエリのメインテーブルから行を除外するためだけにテーブルを使用している場合(このクエリのように、
賞
を取得したいだけです 2012年の場合、Awardwinner
から行をフィルタリングするだけです )、join
を使用したくない 、ただし、presents
を使用します またはin
代わりに、私にとってはより論理的に思えます。