SQL查询包含列表中所有项目的记录

Sin*_*sta 2 mysql sql sqlite oracle relational-division

我有以下表格:

电影

  MOVIE_ID 标题
---------- -----------------------------
         1 肖申克的救赎
         2 教父
         3 教父:第二部分
         4 黑暗骑士
         5 低俗小说
         6 善、恶、丑
         7 辛德勒的名单
         8 愤怒的人
         9 搏击俱乐部
        10 起始
        11 阿甘正传

董事

DIRECTOR_ID 名称
----------- -------------------------
          1 蒂姆·罗宾斯
          2 摩根·弗里曼
          3 马龙·白兰度
          4 阿尔·帕基诺
          5 罗伯特·德尼罗
          6 克里斯蒂安·贝尔
          7 希斯·莱杰
          8 约翰·特拉沃拉
          9 乌玛·瑟曼
         10 克林特·伊斯特伍德
         11 伊莱·瓦拉赫

直接的

  MOVIE_ID DIRECTOR_ID
---------- -----------
         1 1
         1 2
         2 3
         2 4
         3 4
         3 5
         4 6
         4 7
         5 8
         5 9
         6 10

我想要一个返回以导演 x、y 和 z 作为导演的所有电影的查询:

例子:

如果我寻找一部由阿尔·帕基诺克林特·伊斯特伍德主演的电影,它应该不会返回任何内容,因为我没有一部由他们两人担任导演的电影。

然而,如果我要找一部蒂姆·罗宾斯摩根·弗里曼主演的电影,应该会是《肖申克的救赎》

如果使用上述设计无法完成,请提出替代方案。

我已经尝试过,但我的查询将返回结果:(

SELECT m.title FROM Movie m 
WHERE m.movie_id IN (
      SELECT d.movie_id FROM Direct d
      WHERE d.director_id IN (
           SELECT director_id FROM Director dir 
           WHERE name IN('Clint Eastwood', 'Al Pachino')));
Run Code Online (Sandbox Code Playgroud)

Stu*_*tLC 5

这是实现这一目标的一种方法,即对导演进行分组、过滤然后计数:

SELECT m.title 
FROM Movie m
     INNER JOIN Direct md
     on md.movie_id = m.movie_id
     INNER JOIN Directors d
     on md.director_id = d.director_id
WHERE 
     d.name IN('Clint Eastwood', 'Al Pachino')
GROUP BY m.title
HAVING COUNT(DISTINCT d.director_id) = 2;
Run Code Online (Sandbox Code Playgroud)

SqlFiddle在这里

{出于兴趣,这些不是电影里的演员吗?}