【问题标题】:How do I query this many-to-many in SQL如何在 SQL 中查询这个多对多
【发布时间】:2021-09-04 08:05:35
【问题描述】:

我有这些表:

  • 导演(director_id,director_name)
  • 电影(film_id、标题、年份、时长、director_id)
  • 参与(act_idfilm_id、薪水)
  • 演员(act_id,act_name)

我想显示参演过“xxxx”或“yyyy”导演的电影的演员姓名,从未参演过“zzzz”导演的电影

这是正确的方法吗?

select act_name
from Actor
where act_id in (select p.act_id
                 from Participation
                 where p.film_id in (select f.film_id
                                     from Film
                                     where director_id in (select director_id
                                                           from Director
                                                           where director_name = 'xxxx' OR director_name = 'yyyy' AND director_name <> 'zzzz');

【问题讨论】:

  • 使用数据库JOINS。
  • 看来你实际上是在追(NOT) EXISTS
  • 具有预期结果的样本数据会有所帮助。

标签: sql sql-server database join subquery


【解决方案1】:

你已经很接近了。看到这个:

SELECT actorInfo.Act_Id, actorInfo.Act_Name
FROM Actor actorInfo
WHERE actorInfo.Act_Id IN (SELECT Act_Id
                           FROM Participation
                           WHERE Film_Id IN (SELECT Film_Id
                                             FROM Film
                                             WHERE Director_Id IN (SELECT Director_Id
                                                                                        FROM Director
                    WHERE Director_Name IN ('xxxx', 'yyyy'))
                      AND Director_Id NOT IN (SELECT        Director_Id
                                              FROM Director
                                              WHERE Director_Name IN ('zzzz'))))

另一种写相同子查询的方法是:

SELECT actorInfo.Act_Id, actorInfo.Act_Name
FROM Actor actorInfo
INNER JOIN Participation participation ON participation.Act_Id = actorInfo.Act_Id
WHERE participation.Film_Id IN (SELECT Film_Id
                                FROM Film
                                WHERE Director_Id IN (SELECT    Director_Id
                                                      FROM Director
                                                      WHERE Director_Name IN ('xxxx', 'yyyy')))
  AND participation.Film_Id NOT IN (SELECT Film_Id
                                    FROM Film
                                    WHERE Director_Id IN (SELECT Director_Id
                                                          FROM Director
                                                          WHERE Director_Name NOT IN ('zzzz')))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    相关资源
    最近更新 更多