2012-04-08 87 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外queries.In你的第二個查詢是你會的原因在第二個查詢中得到一個錯誤,並且不能使用它。第一個查詢在語法上是正確的。

1

在這種情況下,使用CTE(公用表表達式)可能會有幫助。這是您可以重新使用子查詢的唯一方法。看看你如何使用ROW_NUMBER找到最大的頻率。我也更新了舊學校FROM A, B, C WHERE ...新學校FROM A INNER JOIN B ...(我不是100%肯定的JOIN標準是正確的,但。)

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

好的,謝謝維姆! – user1269298 2012-04-14 23:25:30