Подзапросы с ключевым словом EXISTS

Если вложенный запрос вводится с помощью ключевого слова EXISTS, то он выступает в роли проверки на существование. В предложении WHERE внешнего запроса проверяется факт существования строк, возвращенных вложенным запросом. Вложенный запрос не выдает никаких данных, а возвращает значение TRUE или FALSE.

Вложенный запрос, созданный с помощью ключевого слова EXISTS, имеет следующий синтаксис.

WHERE [NOT] EXISTS (subquery)

По представленному ниже запросу осуществляется поиск всех наименований товаров, относящихся к подкатегории Wheels.

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE EXISTS
    (SELECT * 
     FROM Production.ProductSubcategory
     WHERE ProductSubcategoryID = 
            Production.Product.ProductSubcategoryID
        AND Name = 'Wheels')

Ниже приводится результирующий набор.

Name
--------------------------------------------------
LL Mountain Front Wheel
ML Mountain Front Wheel
HL Mountain Front Wheel
LL Road Front Wheel
ML Road Front Wheel
HL Road Front Wheel
Touring Front Wheel
LL Mountain Rear Wheel
ML Mountain Rear Wheel
HL Mountain Rear Wheel
LL Road Rear Wheel
ML Road Rear Wheel
HL Road Rear Wheel
Touring Rear Wheel

(14 row(s) affected)

Чтобы понять результаты данного запроса, необходимо рассмотреть наименование каждого продукта. Это позволит узнать, возвращается ли в результате выполнения данного вложенного запроса хотя бы одна строка. Иными словами, выдается ли в результате проверки на существование значение TRUE.

Обратите внимание на то, что вложенные запросы, введенные с помощью ключевого слова EXISTS, отличаются от других вложенных запросов следующим образом.

  • Перед ключевым словом EXISTS не ставится имя столбца, константы или другого выражения.

  • Список выборки для вложенного запроса, введенного с помощью ключевого слова EXISTS, практически всегда состоит из знаков «звездочка» (*). Так как производится проверка только на предмет существования строк, удовлетворяющих заданным во вложенном запросе условиям, то нет необходимости выводить имена найденных столбцов.

Важность ключевого слова EXISTS обусловлена тем, что часто без него невозможно найти иное решение без вложенных запросов. Хотя некоторые запросы, созданные с помощью ключевого слова EXISTS, не могут быть выражены по-другому, многие запросы для достижения подобных результатов используют IN или оператор сравнения, измененный с помощью ANY либо ALL.

Например, предыдущий запрос может быть задан с использованием оператора IN.

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN
    (SELECT ProductSubcategoryID
     FROM Production.ProductSubcategory
     WHERE Name = 'Wheels')