2016-05-10 16 views
0

タイトルが私の問題に対応しているかどうかはわかりませんが、これは私が記述できる最良の方法です。再帰文を使用したSQL -

理論的にはhaving節に再帰的な文を持つクエリがあるのだろうかと思っていました。例:

+0

これはできません。左側の 'science_fiction_per_author'を' COUNT(*) 'に置き換えることはできますが、' MAX(COUNT(*)) 'のような別の集約関数の中に入れることはできません。 –

+1

どのDBMSを使用していますか –

+0

さらに、[古いスタイルのJOIN構文]を使用しないでください(http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick -using-old-style-joins.aspx) –

答えて

0

これは実際の再帰ではありませんが、同じフレーズを2回使用して、最も高いカウントを持つ個体を見つけることができます。これはhttp://sqlzoo.net/wiki/More_JOIN_operations

フレーズ

SELECT actor.name,count(movieid) moviesPerActor 
    FROM actor join casting ON actor.id=actorid 
    GROUP BY actor.name 

リスト各アクター名と作られた映画の数で映画のデータベースに基づいています。

同じフレーズが2回使用されます。 Aバージョンは、1人の俳優が作った映画の中で最も多くの映画を見つけるために使用され、Bバージョンは、その俳優を識別するために使用されます。あなたがより効率的に最高値を持つ要素を識別するために、ウィンドウ関数を使用することができます(MSSQLとOracleを含む)SQLのいくつかのバージョンでは

SELECT B.name from 
(SELECT MAX(moviesPerActor) as highestNumberOfMovies 
FROM(
    SELECT actor.name,count(movieid) moviesPerActor 
    FROM actor join casting ON actor.id=actorid 
    GROUP BY actor.name 
) as A) as A1 
JOIN 
(
    SELECT actor.name,count(movieid) moviesPerActor 
    FROM actor join casting ON actor.id=actorid 
    GROUP BY actor.name 
) as B 
ON B.moviesPerActor = highestNumberOfMovies 

関連する問題