ИСПОЛЬЗОВАНИЕ EXISTS С СООТНЕСЕННЫМИ ПОДЗАПРОСАМИ
В соотнесенном подзапросе, предложение EXISTS оценивается отдельно для каждой строки таблицы имя
которой указано во внешнем запросе, точно также как и другие операторы предиката, когда вы используете
соотнесенный
подзапрос. Это дает возможность использовать EXISTS как верный предикат, который генерирует различные ответы
для
каждой строки таблицы указанной в основном запросе. Следовательно информация из внутреннего запроса, будет
сохранена,
если выведена непосредственно, когда вы используете EXISTS таким способом. Например, мы можем вывести
продавцов
которые имеют многочисленых заказчиков ( вывод для этого запроса показывается в Рисунке 12.2 ):
SELECT DISTINCT snum
FROM Customers outer WHERE EXISTS ( SELECT * FROM Customers inner WHERE inner.snum = outer.snum AND inner.cnum < >
outer.cnum );
Рисунок 12. 2: Использование EXISTS с соотнесенным подзапросом
Для каждой строки-кандидата внешнего запроса ( представляющей заказчика проверяемого в настоящее время
), внутренний запрос находит строки которые совпадают со значением поля snum ( которое имел продавец ),
но не со
значением поля cnum ( сответствующего другим заказчикам ). Если любые такие строки найдены внутренним
запросом, это
означает, что имеются два разных заказчика обслуживаемых текущим продавцом ( то-есть продавцом заказчика
в текущей
строке-кандидата из внешнего запроса ). Предикат EXISTS поэтому верен для текущей строки, и номер продавца
поля (snum)
таблицы указанной во внешнем запросе будет выведено. Если был DISTINCT не указан, каждый из этих
продавцов будет
выбран один раз для каждого заказчика к которому он назначен.