2017-05-28 9 views
0

私はXの言語よりも多くで映画を作ってきた俳優のランキングを作成しようとしているのUSINGサブクエリの順序を保持し、これが私のスキーマです:PostgreSQLは演算子

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句にサブクエリを移動し、フィールドとしてカウント数を計算し、そのことにより、注文に続いて

、:自然についてheadsupのおかげで参加

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

回答を編集するのは好きではありませんが、質問に少し間違いがあることを警告したいと思います。 ActorとActのあいまいなエイリアス、movie_id(存在しない列)を使って映画に参加する。さらに、この間違いは、クエリが正しくない、私はエラーがある: "共通の列名" actorid "は、複数回、左のテ​​ーブルに表示されます"。私はそれをどこで修正するか分からない。 :( –