当前位置: 首页 > 面试题库 >

为什么在SQL中不可避免地要使用双重嵌套的NOT EXISTS语句

濮冠宇
2023-03-14
问题内容

这更多是出于好奇/科学兴趣,而不是基于真正的问题,我曾经问过数据库讲师这件事,但是他无法回答/理解我的问题。所以我决定过来这里。

编程语言应该是一种工具,并且可以使工作变得更容易,对吗?因此,为什么只需执行一次操作就可以在一个表中找到所有条目SELECT * FROM foo WHERE bar=42;。但是,一旦涉及到多个表,就没有简单/直观的方式说“找到满足此条件的所有元组”吗?

脚本中给定的示例是这样的(这是从德语翻译的,因此命名可能会有些混乱):

对于以下格式的表:

  • 组件( CNR ,Cname,Color,Weight,City)
  • 项目( PNR ,Pname,City)
  • scp( SNRCNRPNR ,数量)

主键以粗体显示。该示例是关于运送到不同城市的不同项目的组件的。

任务是编写一个查询,以查找/已运送到一个特定城市中所有项目的所有组件。

给定的解决方案如下所示:

SELECT CNR
FROM components
WHERE NOT EXISTS ( SELECT 1
                  FROM project
                  WHERE project.city = 'Foobar Town'
                  AND NOT EXISTS ( SELECT 1
                                 FROM scp
                                 WHERE scp.PNR = projekt.PNR
                                 AND scp.CNR = components.CNR ));

我的意思是,这是正确的,有道理,甚至可行。但这不是直观的,当然也不能使生活变得更轻松!那么我想知道这个原因在哪里呢?由于我们被告知对考试至关重要,因此我们能够编写这样的查询,因此我无法绕开它。

我还没有找到一个更简单的解决方案。既不能通过谷歌搜索,也不能自己尝试。一定有比“每个人都懒得解决这个问题”更好的理由。有任何想法吗?

html" target="_blank">示例以及本课程中提供给学生的所有材料均基于SQL92。

谢谢您的回答


问题答案:

您的问题是:“查找/运送到一个特定城市中所有项目的所有组件。” 您将其改写为“查找给定城市中没有没有项目的项目的所有项目。”

我更倾向于直接回答这个问题:

select scp.component
from scp join
     projects p
     on scp.pnr = p.pnr
where p.city = 'Foobar Town'
group scp.component
having count(distinct scp.pnr) = (select count(distinct pnr)
                                  from projects
                                  where city = 'Foobar Town'
                                 );

这将计算城市中不同项目的数量,并将其与城市中项目的数量进行比较(此distinctID在子查询中可能不是必需的)。

首先,我不确定这是否更简单。其次,我是第一个承认该NOT EXISTS方法 可能 更有效的方法,尽管NOT EXISTS子查询中的嵌套可能会对性能造成不利影响。但是,我确实认为这更容易理解。



 类似资料:
  • 问题内容: Process p = Runtime.getRuntime().exec(command); is = p.getInputStream(); byte[] userbytes = new byte[1024]; is.read(userbytes); 我想从java在linux os中执行shell命令。但是Pmd报告说不要使用Java Runtime.exec()。为什么?是什么

  • 问题内容: 什么时候嵌套类可行?我看到的最常见的优点是“共享范围”(跨类使用变量)。 这是否比仅将嵌套类放入其自己的文件中并通过构造函数传递参数更具吸引力/最佳实践少? 问题答案: 使用嵌套类的原因有很多,其中包括: 这是一种对仅在一个地方使用的类进行 逻辑分组 的方法。 它增加了 封装 。 嵌套类可以导致更具 可读性和可维护性的代码 。 子级到父级的连接更为简单,因为它 直观地说明 了每个类的变

  • 问题内容: 通常我会尽可能避免转换类型,因为我认为这是不良的编码实践,并且可能会导致性能下降。 但是,如果有人要我解释为什么会这样,我可能会像前灯中的鹿一样看它们。 那么,为什么/何时铸造不好? 它对于Java,C#,C ++是通用的,还是每个不同的运行时环境都按照自己的方式处理? 欢迎使用任何语言的细节,例如为什么在c ++中不好? 问题答案: 您已经用三种语言标记了这三种语言,答案在三种语言之

  • 在React中,我尝试了两种方法: 然后更改状态this.setState(this.state) 克隆状态,更改状态克隆,然后更改此.setState(stateClone) 它们都起作用,产生相同的结果。为什么建议(在文档中)设置为状态克隆(使用Object.assign),而不是设置为状态本身?状态的对象标识在React中重要吗(没有Redux)?似乎只要调用setState,不管状态对象标

  • 问题内容: 我有下面列出的3个表: 该SQL描述了我想要的: 问题是,在这种情况下,我有一个很大的NOT IN值,据我所知它将影响服务器性能(我不确定,因为我从未尝试对其进行基准测试或Google评估)。有什么建议吗? 问题答案: 试试这个 :

  • 我的公司不允许使用Mockito。在单元测试中验证。甚至有一个定制的声纳规则 规则如下 应该通过断言来验证结果,而不是使用“验证到执行”过程验证。因为如果我们验证流程,在流程更改后需要更多的努力来维护测试,但输入和输出保持不变。确保每一行代码都对结果有影响,并断言结果以证明逻辑正确 不合规代码示例 合规解决方案 对于数据库或中间件操作,断言使用嵌入式数据库或中间件成功写入数据。 对于restful