2015-10-21 98 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' 
);