Концептуально это просто двойной минус.
Выберите всех пилотов, для которых в ангаре не существует самолета, на котором они не могут летать.
Нокажется, вы спрашиваете о механике самого запроса?Он использует два уровня коррелированного подзапроса.
Если уменьшить число строк до минимальной суммы и добавить дополнительную таблицу, чтобы немного упростить объяснение (внешний экземпляр PilotSkills в запросе используется только дляполучить список пилотов).Тогда запрос будет выглядеть так:
SELECT pilot_name
FROM Pilots
WHERE NOT EXISTS
(SELECT *
FROM Hangar
WHERE NOT EXISTS
(SELECT *
FROM PilotSkills
WHERE (Pilots.pilot_name = PilotSkills.pilot_name)
AND (PilotSkills.plane_name = Hangar.plane_name)));
Пилоты
pilot_name
===========
'Celko'
'Higgins'
Ангар
plane_name
=============
'B-1 Bomber'
'F-14 Fighter'
PilotSkills
pilot_name plane_name
=========================
'Celko' 'F-14 Fighter'
'Higgins' 'B-1 Bomber'
'Higgins' 'F-14 Fighter'
Если вы хотите знать, какие пилоты могут управлять всеми самолетами в ангаре, тогда
- За каждый
Pilots.pilot_name
по очереди - Посмотрите на каждый
Hangar.plane_name
по очереди - И проверьте, есть ли в
PilotSkills
соответствующая строка для этого pilot_name,plane_name
Если шаг 3 ложный, то мы знаем, чтов ангаре есть хотя бы один самолет, пилот не может летать, и мы можем прекратить обработку этого Pilots
ряда и перейти к следующему.Если шаг 3 верен, тогда мы должны вернуться к шагу 2 и проверить следующую плоскость в ангаре.Если мы закончим обработку всех самолетов в ангаре и для каждого из них будет соответствующая строка в PilotSkills
, то мы знаем, что этот пилот может летать на всех самолетах.
Или, говоря иначе, мы знаем, что не существует плоскости (как мы их все проверили), для которой не существует подходящей строки в таблице PilotSkills
.