gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:56:25 26 4
gpt4 key购买 nike

这更多是出于好奇/科学兴趣,而不是基于实际问题。

编程语言应该是一种工具,而工具就是用来简化工作的。那么,为什么您可以通过简单地执行 SELECT * FROM foo WHERE bar=42; 来找到一个表中的所有条目,但是一旦涉及多个表,就没有简单/直观的方法说“找到所有满足此条件的元组”?

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

component(**CNR**,Cname,Color,Weight,City)
project(**PNR**,Pname,City)
scp(**SNR**,**CNR**,**PNR**,Quantity)

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

给定的解决方案:

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 ));

这是正确的,有道理的,甚至是有效的。但这并不直观——“给我这个”的直截了当的陈述。为什么?

我们类(class)中的示例和所有 Material 均基于 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'
);

这会计算城市中不同项目的数量,并将它们与城市中的项目数量进行比较(子查询中可能不需要 distinct id。

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

关于mysql - 为什么在 SQL 中不可避免地使用双重嵌套 NOT EXISTS 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27722404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com