2017-05-28 187 views
0

我試圖創建誰已經超過X語言更多國產電影演員的排名保持一個子查詢的順序,這是我的架構:PostgreSQL的 - 使用IN操作符

actor(actorid, actorname) 
act (actoirid, movieid, as_character) 
movie (movieid, title, mvyear) 
lang (movieid, lang) 

這是查詢我堅持:

SELECT actorid, actorname, title, mvyear, as_character, lang 
FROM actor NATURAL JOIN act NATURAL JOIN movies_slice NATURAL JOIN lang 
WHERE actorid IN (
    SELECT act.actorid FROM act NATURAL JOIN lang 
    GROUP BY (act.actorid) HAVING COUNT(DISTINCT lang.lang) > $X$ 
    ORDER BY COUNT(DISTINCT lang.lang) DESC --<<< Want to keep this order. 
) 

我知道IN運算符右側子查詢的順序將被丟棄。我該如何解決這個問題?

回答

0

千萬不要使用NATURAL JOIN。這是一個等待發生的錯誤。連接鍵是匹配的任何列名 - 它甚至不遵循聲明的外鍵關係。而且,查詢很難遵循,因爲您不知道用於加入的密鑰。

然後,做你想做的,移動子查詢到FROM條款,通過計算算作一個領域,順序爲:

SELECT a.actorid, a.actorname, m.title, m.mvyear, act.as_character, l.lang 
FROM actor a JOIN 
    act 
    USING (actorid) JOIN 
    movies m 
    USING (movieid) JOIN 
    lang l 
    USING (movieid) JOIN 
    (SELECT act.actorid, COUNT(DISTINCT l.lang) as numlangs 
     FROM act JOIN 
      lang l 
      USING (movieid) 
     GROUP BY act.actorid 
     HAVING COUNT(DISTINCT l.lang) > $X$ 
    ) al 
    USING (actorid) 
ORDER BY al.numlangs DESC; 
+0

感謝您的平視有關自然加入...是在這種情況下使用JOIN和INNER JOIN等價物嗎? –

+0

@ MateusS.Vasconcelos。 。 。是。沒有任何'FULL'或'CROSS'修飾符,'JOIN'就是'INNER JOIN'。 –

+0

我不喜歡編輯答案,但我想警告您,您的查詢中存在一些小錯誤。像演員和行爲的模棱兩可的別名,以及使用movie_id(不存在列)來加入電影。此外,這個錯誤,查詢不正確,我得到一個錯誤:「公共列名」actorid「在左表中出現不止一次」。我不知道在哪裏解決它。 :( –