( SELECT * FROM EQUIPAGE E2
WHERE E2.EQ_FL_DATEBETWEEN'1.02.08'AND'29.02.08'
AND E2.EQ_PR_CODE=P.PR_CODE)
Разберем полученный запрос – внешний запрос выводит фамилию, имя, отчество для всех членов экипажа которые совершали полет в январе 2008 года, ключевое слово DISTINCT нужно, чтобы даже те члены экипажа, которые летали неоднократно, выводились только один раз. Во внешнем запросе используются псевдонимы таблиц P для PERSON и E1 для EQUIPAGE. В предложении WHERE соединяем два условия, первое ограничивает выводимый список членов экипажа теми, которые совершали полет в январе. Второе условие требует, чтобы текущая личность не совершала полет в течении февраля, т.е. чтобы за указанный период для этой личности не существовало строки в таблице EQUIPAGE. Во внешнем запросе для таблицы EQUIPAGE используется псевдоним Е2.
Приведем вариант этого запроса с использованием NOT IN.[51]
SELECT DISTINCT P.PR_NAME2AS"Имя",
P.PR_NAME3AS"Отчество",
P.PR_NAMEAS"Фамилия"
FROM PERSONP
INNER JOIN EQUIPAGEE1ONE1.EQ_PR_CODE=P.PR_CODE
WHERE (E1.EQ_FL_DATEBETWEEN'1.01.08'AND'31.01.08')
AND (NOT P.PR_CODEIN
( SELECT EQ_PR_CODEFROMEQUIPAGE
WHERE EQ_FL_DATEBETWEEN'1.02.08'AND'29.02.08' ))
Здесь мы делаем следующее – во внутреннем подзапросе находим коды всех личностей из таблицы EQUIPAGE, которые совершали полет в феврале, внешний запрос выводит фамилию, имя, отчество для тех кто летал в январе 2008 и при этом среди них нет тех, кто содержится в результате вывода подзапроса (т.е. те кто летал в феврале).