2015-10-21 94 views
1

我需要創建一個包含那些在2010年創建視圖的問題

我寫了這個發佈的戲劇電影演員的id和名稱的看法:

CREATE VIEW DRAMA_ACTORS 
AS 
    SELECT 
     ACTOR_ID, FIRST_NAME, LAST_NAME 
    FROM 
     ACTOR, FILM_ACTOR, FILM, FILM_CATEGORY, CATEGORY 
    WHERE 
     ACOTR.ACTOR_ID = FILM_ACTOR.ACTOR_ID 
     AND FILM_ACTOR.FILM_ID = FILM.FILM_ID 
     AND FILM.FILM_ID = FILM_CATEGORY.FILM_ID 
     AND FILM_CATEGORY.CATEGORY_ID = CATEGORY.CATEGORY_ID 
     AND CATEGORY.NAME = 'Drama' 
     AND FILM.RELEASE_YEAR = '2010'; 

架構就像是這樣的:

enter image description here

感謝所有幫助

+2

[不良習慣踢:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - 在ANSI - ** 92 ** SQL標準中**舊式*逗號分隔的表*樣式列表已替換爲* proper * ANSI'JOIN'語法(**超過20年**以前),並且不鼓勵使用它 –

+0

您正在使用哪些DBMS? Postgres的?甲骨文? –

+0

做SELECT DISTINCT,以避免重複(如果演員已經在當年的幾部電影中)。你是否將年存儲爲文本?!?不要這樣做,使用整數! – jarlh

回答

1

您可能需要使用JOIN這樣的:

SELECT a.ACTOR_ID, a.FIRST_NAME, a.LAST_NAME 
FROM FILM AS f 
JOIN FILM_ACTOR AS fa ON fa.FILM_ID = f.FILM_ID 
JOIN ACOTR AS a ON a.ACTOR_ID = fa.ACTOR_ID 
JOIN FILM_CATEGORY AS fc ON fc.FILM_ID = f.FILM_ID 
JOIN CATEGORY AS c ON c.CATEGORY_ID = fc.CATEGORY_ID 
WHERE c.NAME = 'Drama' AND f.RELEASE_YEAR = '2010' 

如果你有重複的結果,在查詢中使用DISTINCTGROUP BY

+0

內部連接和連接有什麼區別?謝謝 – cdl2333

+0

這個問題的最佳答案(http://stackoverflow.com/questions/565620/difference-between-join-and-inner-join)應該比我的解釋更好:) – jhmt

+0

所以在這種情況下,我可以使用加入以及? – cdl2333

0

更好(在我看來)避免首先創建重複,而不是在之後消除它們。

如果我們要找出誰一直在戲劇在2010年的演員,它不應該的問題,如果他們已經在多個電影 - 我們只是想斷言,至少一個這樣的電影存在:

SELECT 
    ACTOR_ID, FIRST_NAME, LAST_NAME 
FROM 
    ACTOR a 
WHERE 
    EXISTS (SELECT * 
     FROM FILM_ACTOR fa 
       INNER JOIN 
      FILM f 
       ON fa.FILM_ID = f.FILM_ID 
       INNER JOIN 
      FILM_CATEGORY fc 
       ON 
        fc.FILE_ID = f.FILM_ID 
       INNER JOIN 
      CATEGORY c 
       ON 
        fc.CATEGORY_ID = c.CATEGORY_ID 
    WHERE 
     a.ACTOR_ID = fa.ACTOR_ID 
    AND c.NAME = 'Drama' 
    AND f.RELEASE_YEAR = '2010' 
);