【问题标题】:nested NOT EXIST in SQL在 SQL 中嵌套 NOT EXIST
【发布时间】:2015-05-20 15:37:30
【问题描述】:

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

【问题讨论】:

标签: sql database nested relation not-exists


【解决方案1】:

从最深的嵌套查询到最外层。当您了解一个级别时,将其替换为简单的英文描述。例如,上面查询中的最内层可以这样描述:“同一部电影,同一演员,不同角色”,或“演员在电影中有多个角色”。向外工作,NOT EXISTS 给了我们“演员在电影中的角色不超过一个”。将其与 WHERE 子句结合起来,我们得到“演员是电影的导演,并且演员在电影中的角色不超过一个”。继续这样做,直到你达到最高水平......

【讨论】:

  • 谢谢!你能再解释一下吗..?然后当结合“演员是电影的导演并且演员在电影中没有多个角色”时,我们会得到什么。使用“WHERE d2.name = d1.name AND NOT EXISTS()”?我也不太明白为什么它使用 d1 和 d2。
  • d1 和 d2 是“自联接”。这使整个查询能够从同一个表中获取两个不同的行。真的和“一个角色以上的演员”是一回事,只不过对于导演来说。
【解决方案2】:

这看起来像是relational division 公式之一的扩展,特别是除法与余数。

Joe Celko 的This article 对这个概念以及实现它的各种方式进行了非常详尽的解释。

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

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

您正在寻找一部电影的导演姓名,其中没有同一导演的电影,该导演没有扮演的角色,也没有同一导演的同一部电影的另一个角色。

很难解决这个问题,但据我所知,这会演变为想要导演的名字出现在所有电影中,其中导演在电影中以演员的身份出现在一个角色中。

【讨论】:

  • 非常感谢!您能否进一步解释一下第二个不存在“WHERE d2.name = d1.name AND NOT EXISTS”如何用于“该导演没有扮演的角色”?为什么要使用 d1 和 d2?
  • 据我了解,在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 中,NOT EXIST 消除了在那里出演电影的导演?
猜你喜欢
  • 2013-02-13
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多