我正在尝试学习关系查询语言和SQL,下面的例子让我很困惑。你能帮忙解释一下我在哪里开始分析这些嵌套的NOT EXIST(最外层的吗?),以及它们各自的作用?非常感谢!
注意:这只是一个示例,而不是真实世界的应用程序。
考虑导演{姓名,电影}和演员{姓名,电影,角色}
SELECT
d1.name
FROM
Director d1
WHERE NOT EXISTS (SELECT d2.movie
FROM Director d2
WHERE d2.name = d1.name
AND NOT EXISTS(SELECT a1.role
FROM Actor a1
WHERE a1.name = d2.name
AND a1.movie = d2.movie
AND NOT EXISTS(SELECT a2.role
FROM Actor a2
WHERE a2.role ̸= a1.role
AND a2.movie = a1.movie
AND a2.name= a1.name
)
)
)
答案 0 :(得分:1)
这看起来像是relational division的一个公式的扩展,特别是与余数的划分。
Joe Celko的This article对这个概念以及实现它的各种方法有着非常详尽的解释。
This fiddle应该让您更多地了解正在发生的事情。
你可以阅读任何一个方向,但在这种情况下,从外面开始可能更容易。
你正在寻找导演的名字,因为这部电影中没有同一导演的电影没有该导演所扮演的角色,也不是同一部电影的另一个角色。同一位导演。
很难做到这一点,但是我能说的最好的是,这将导致所有导演在电影中扮演演员的所有电影的导演名称只有一个角色
答案 1 :(得分:1)
从最深的嵌套查询工作到最外层。如您了解某个级别,请将其替换为简单的英语说明。例如,上面查询中最里面的级别可以这样描述:"相同的电影,同一个演员,不同的角色"或者#34;演员在电影中有多个角色"。向外工作,不是EXISTS给我们"演员在电影中没有多个角色"。将它与WHERE子句相结合,我们得到了#14;演员是电影的导演,演员在电影中没有多个角色"。一直这样做,直到你达到顶级......