Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных / БД2012 / Understanding.SQL.doc
Скачиваний:
283
Добавлен:
28.03.2015
Размер:
1.75 Mб
Скачать

Выбор столбцов с помощью exists

В вышеупомянутом примере, EXISTS должен быть установлен так чтобы легко выбрать один столбец, вместо того, чтобы выбирать все столбцы используя в выборе звезду( SELECT *) В этом состоит его отличие от подзапроса который ( как вы видели ранее в Главе 10 мог выбрать толь- ко один столбец ) . Однако, в принципе он мало отличается при выборе EXISTS столбцов, или когда выбираются все столбцы, потому что он просто замечает - выполняется или нет вывод из подзапроса - а не использует выведенные значения.

Использование 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 );

=============== SQL Execution Log ============

| |

| SELECT DISTINCT cnum |

| FROM Customers outer |

| WHERE EXISTS |

| (SELECT * |

| FROM Customers inner |

| WHERE inner.snum = outer.snum |

| AND inner.cnum < > outer.cnum); |

| ============================================= |

| cnum |

| ----- |

| 1001 |

| 1002 |

=============================================

Рисунок 12. 2: Использование EXISTS с соотнесенным подзапросом Для каждой строки-кандидата внешнего запроса ( представляющей заказчика проверяемого в настоящее время ), внутренний запрос находит строки которые совпадают со значением пол snum ( которое имел продавец ), но не со значением пол cnum ( соответствующего другим заказчикам ). Если любые такие строки найдены внутренним запросом, это означает, что имеются два разных заказчика обслуживаемых текущим продавцом ( то есть продавцом заказчика в текущей строке-кандидата из внешнего за- проса ). Предикат EXISTS поэтому верен для текущей строки, и номер продавца пол (snum) таблицы указанной во внешнем запросе будет выведено. Если был DISTINCT не указан, каждый из этих продавцов будет выбран один раз для каждого заказчика к которому он назначен.

Соседние файлы в папке БД2012