Database Programming & Design



         

The SQL Double Double


, Spring 1998


Оригинал статьи можно найти по адресу

, всемирно известный исследователь, консультант и

лектор, имеющий богатый практический опыт использования языка SQL

В условиях выборки языка SQL помимо прочего можно использовать

подзапросы, или вложенные запросы. Имеется много типов

подзапросов, но их основное назначение состоит в возможности

подразделения наборов данных - выполнении процесса, называемого

"реляционным делением". Для выполнения реляционного деления можно

применять и соединения, но при определенных обстоятельствах

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

Проще всего понять подзапросы без корреляции. Они выполняются

снизу вверх по одному разу на каждом уровне. Вот пример

подзапроса без корреляции с использованием NOT EXISTS:

SELECT A.COL1, A.COL2, A.COL6, A.COL7

FROM TAB1 A

WHERE NOT EXISTS

(SELECT 1

FROM TAB2 B

WHERE B.COL4 = :hv1)

При выполнении оператора проверяется существование значения :hv1

в столбце COL4 таблицы TAB2. Если такое значение не входит в

состав значений COL4, SELECT верхнего уровня возвращает в

результирующую таблицу значения столбцов COL1, COL2, COL6 и COL7

из всех строк таблицы TAB1. Если по меньшей мере одно значение

:hv1 находится в COL4, SELECT верхнего уровня не выполняется и

результатом является пустое множество строк или SQLCODE = +100.

Первым выполняется нижний SELECT, возвращающий ответ true, если

удается найти хотя бы одну строку, которая удовлетворяет условию

B.COL4 = :hv1, и false, если ни одной такой строки найти не

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

результат нижнего запроса есть false (поскольку используется NOT

EXISTS).

Достаточно часто используются одиночные подзапросы с корреляцией.

В подзапросе присутствует корреляция, если в нижнем SELECT

имеется ссылка на столбец верхнего SELECT (одноуровневое

распространение). Такие подзапросы легко распознать, если в

разделах FROM применяются псевдонимы, и эти псевдонимы

предшествуют любому имени столбца в разделе WHERE.


Содержание  Назад  Вперед