EXISTS переводится как «существует» - это оператор, который возвращает логическое выражение (истина или ложь). Он берет подзапрос как аргумент и получает «истина», если тот производит любой вывод или «ложь», если тот не делает этого. Иными словами функция EXISTS возвращает значение «истина», если подзапрос возвращает хотя бы одну строку и «ложь», если подзапрос не возвращает ни одной строки. Функция EXISTS используется в условии WHERE.
Так как внутренний оператор SELECT содержит произвольное количество столбцов, вместо списка столбцов обычно используют символ * (звездочка), что означает, что выбираются все столбцы.
В качестве примера выведем фамилию, имя, отчество членов экипажа летавших в феврале 2008 года (если в таблице EQUIPAGE существует строка для выбранной личности с атрибутом EQ_FL_DATE попадающим в февраль 2008 года).[48]
SELECT PR_NAME2AS"Имя",
PR_NAME3AS"Отчество",
PR_NAMEAS"Фамилия"
FROM PERSON
WHERE EXISTS( SELECT * FROM EQUIPAGEE
WHERE E.EQ_FL_DATEBETWEEN'1.02.08'AND'29.02.08'
AND E.EQ_PR_CODE=PERSON.PR_CODE )
Для каждой строки-кандидата внешнего запроса (представляющей личность, проверяемую в настоящее время), внутренний запрос находит строки, которые относятся к этой личности (совпадение E.EQ_PR_CODE = PERSON.PR_CODE) и проверяет попадание даты вылета (EQ_FL_DATE) в заданный интервал.
Альтернативным способом получения такого же результата будет использование связывания таблиц PERSON и EQUIPAGE и исключения дубликатов при помощи ключевого слова DISTINCT.
Использование варианта IN с подзапросами
Еще одним способом решить поставленную задачу является использование варианта IN. То есть во внутреннем запросе нужно из таблицы EQUIPAGE найти коды личностей (EQ_PR_CODE), даты вылета которых (EQ_FL_DATE) попадают в заданный интервал. Во внешнем запросе выводим фамилию, имя, отчество из таблицы PERSON коды которых, попадают в найденный перечень.[49]