帮助我理解嵌套SELECT语句的这种特殊用法

Ham*_*ter 5 sql select nested

这个网站:

表:

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就没有意义,对吧?

Tho*_*mas 1

我们想要的是一个可以驾驶机库中每架飞机的飞行员的独特名单。对于一个特定的飞行员来说,不可能存在一架他们不能驾驶的飞机。因此,我们想要获取每个飞行员的所有飞机的列表,看看是否有一架他们无法驾驶。如果有(飞行员无法飞行),我们会将其从列表中删除。剩下的人就可以驾驶机库里的所有飞机。

更正式地说,找到飞行员姓名的不同列表,使得对于给定的飞行员,在飞机集合(机库)中不存在飞机,使得该飞机不存在于给定飞行员的技能集合中。

“找到飞行员姓名的清晰列表……”

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)