从这个网站:
表:
CREATE TABLE PilotSkills
(pilot_name CHAR(15) NOT NULL,
plane_name CHAR(15) NOT NULL,
PRIMARY KEY (pilot_name, plane_name));
CREATE TABLE Hangar
(plane_name CHAR(15) NOT NULL PRIMARY KEY);
Run Code Online (Sandbox Code Playgroud)
查询:
SELECT DISTINCT pilot_name
FROM PilotSkills AS PS1
WHERE NOT EXISTS
(SELECT *
FROM Hangar
WHERE NOT EXISTS
(SELECT *
FROM PilotSkills AS PS2
WHERE (PS1.pilot_name = PS2.pilot_name)
AND (PS2.plane_name = Hangar.plane_name)));
Run Code Online (Sandbox Code Playgroud)
我理解它用于(集合划分)的问题,包括将其描述为"在这个机库中没有飞机我不能飞行!"的类比.我不明白的是这里的工作究竟是什么,以及它如何结合起来做它所说的.
难以说明我目前的困难......
编辑:让我先问一下这样的事情,确切地说:
SELECT DISTINCT pilot_name
FROM PilotSkills
WHERE NOT EXISTS
(SELECT *
FROM Hangar)
Run Code Online (Sandbox Code Playgroud)
我想我在这里缺少一些基本的理解......
编辑:不相关,没有第三个嵌套的SELECT就没有意义,对吧?
我们想要的是一个可以驾驶机库中每架飞机的飞行员的独特名单。对于一个特定的飞行员来说,不可能存在一架他们不能驾驶的飞机。因此,我们想要获取每个飞行员的所有飞机的列表,看看是否有一架他们无法驾驶。如果有(飞行员无法飞行),我们会将其从列表中删除。剩下的人就可以驾驶机库里的所有飞机。
更正式地说,找到飞行员姓名的不同列表,使得对于给定的飞行员,在飞机集合(机库)中不存在飞机,使得该飞机不存在于给定飞行员的技能集合中。
“找到飞行员姓名的清晰列表……”
Select Distinct pilot_name
From PilotSkills As PS1
...
Run Code Online (Sandbox Code Playgroud)
“......对于给定的飞行员,飞机集合中不存在飞机(机库)......”
Select Distinct pilot_name
From PilotSkills As PS1
Where Not Exists (
Select 1
From Hanger
Run Code Online (Sandbox Code Playgroud)
“......使得这架飞机不存在于给定飞行员的技能集中。”
Select Distinct pilot_name
From PilotSkills As PS1
Where Not Exists (
Select 1
From Hanger As H
Where Not Exists (
Select 1
From PilotSkills As PS2
Where PS2.pilot_name = PS1.pilot_name
And PS2.plane_name = H.plane_name
)
)
Run Code Online (Sandbox Code Playgroud)