在SQL中嵌套NOT EXIST

时间:2015-03-18 00:26:34

标签: sql database nested relation not-exists

我正在尝试学习关系查询语言和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
                                                   )
                                 )
                  )

2 个答案:

答案 0 :(得分:1)

这看起来像是relational division的一个公式的扩展,特别是与余数的划分。

Joe Celko的

This article对这个概念以及实现它的各种方法有着非常详尽的解释。

This fiddle应该让您更多地了解正在发生的事情。

你可以阅读任何一个方向,但在这种情况下,从外面开始可能更容易。

你正在寻找导演的名字,因为这部电影中没有同一导演的电影没有该导演所扮演的角色,也不是同一部电影的另一个角色。同一位导演。

很难做到这一点,但是我能说的最好的是,这将导致所有导演在电影中扮演演员的所有电影的导演名称只有一个角色

答案 1 :(得分:1)

从最深的嵌套查询工作到最外层。如您了解某个级别,请将其替换为简单的英语说明。例如,上面查询中最里面的级别可以这样描述:"相同的电影,同一个演员,不同的角色"或者#34;演员在电影中有多个角色"。向外工作,不是EXISTS给我们"演员在电影中没有多个角色"。将它与WHERE子句相结合,我们得到了#14;演员是电影的导演,演员在电影中没有多个角色"。一直这样做,直到你达到顶级......