2012-04-08 5 views
0

これは質問がsqlzooである、と私は、コードを次のように書いたが、私はsqlzoo joinII運動 - 映画データベース4aの

SELECT year, freq 
FROM (SELECT yr AS year,count(title) AS freq 
FROM movie, actor, casting 
WHERE name= 'John Travolta' 
AND movie.id=movieid 
AND actor.id=actorid 
GROUP BY yr) AS a 
WHERE freq=(
SELECT MAX(freq) 
FROM (SELECT yr AS year,count(title) AS freq 
FROM movie, actor, casting 
WHERE name= 'John Travolta' 
AND movie.id=movieid 
AND actor.id=actorid 
GROUP BY yr) AS b 
) 

は、なぜそれがこのようにすることはできませんあまりにも冗長であると感じ?

SELECT year, freq 
FROM (SELECT yr AS year,count(title) AS freq 
FROM movie, actor, casting 
WHERE name= 'John Travolta' 
AND movie.id=movieid 
AND actor.id=actorid 
GROUP BY yr) AS a 
WHERE freq=(
SELECT MAX(freq) 
FROM a 
) 

答えて

0

あなたは内側のものはactually.Thatを存在しない「」あなたは意志理由でエイリアスを使用しているあなたの2番目のクエリ最初にして、外queries.In評価されたサブは、問い合わせを書いているときはいつでも2番目のクエリでエラーが発生し、使用できません。最初のクエリは構文的に正しいものです。

1

このような場合は、CTE(Common Table Expression)を使用すると便利です。サブクエリを再利用できる唯一の方法です。 ROW_NUMBERを使って、最も頻度の高いものを見つける方法を見てください。私はまた、新しい学校FROM A INNER JOIN B ...(私は100%ではないよインクルードは基準がが正しいJOINを確認してください。)に古い学校FROM A, B, C WHERE ...を更新しました

WITH a AS 
(
    SELECT 
     yr AS year, 
     COUNT(title) AS freq 
    FROM 
     movie 
    INNER JOIN 
     casting ON movie.id = casting.movieid 
    INNER JOIN 
     actor ON actor.id = casting.actorid 
    WHERE 
     name = 'John Travolta' 
    GROUP BY 
     yr), 
b AS 
(
    SELECT 
     year, freq, 
     ROW_NUMBER() OVER (ORDER BY freq DESC) as RowNum 
    FROM a 
) 
SELECT year, freq 
FROM b 
WHERE RowNum = 1 
+0

[OK]を、ありがとうヴィム! – user1269298