Database Programming & Design



         

The SQL Double Double - часть 2


Одиночные

подзапросы с корреляцией выполняются в манере сверху-вниз-наверх

по одному разу для каждой строки верхнего SELECT. Вот пример

запроса с одиночным вложенным запросом и использованием

псевдонимов A и B:

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

FROM TAB1 A

WHERE A.COL7 = 'X'

AND NOT EXISTS

(SELECT 1

FROM TAB2 B

WHERE A.COL2 = B.COL4)

Выполнение этого запроса начинается с обнаружения первой

уточненной строки верхнего запроса (WHERE COL7 = 'X'). После

этого проверяется существование A.COL2 (с использованием значения

этого столбца в первой уточненной строке TAB1) где-либо в стробце

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

значений COL4, верхний SELECT выбирает значения столбцов COL1,

COL2, COL6 и COL7 таблицы TAB1 из первой уточненной строки. Если

хотя бы одно значение A.COL2 обнаруживается в COL4, то верхний

SELECT продвигается к следующей уточненной строке (WHERE COL7 =

'X'). Процесс продолжается до тех пор, пока верхний запрос не

сможет обнаружить следующую уточненную строку. Тем самым, сначала

выполняется верхний запрос, подготавливающий список строк, для

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

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

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

строка не удовлетворяет условию. Верхний запрос перемещает

информацию текущей строки в окончательный результат только в том

случае, когда результатом нижнего запроса является false

(поскольку используется NOT EXISTS).

Двойные подзапросы с корреляцией нетипичны для разработчиков,

использующих SQL. В частности, меньше 10% разработчиков на базе

DB2 когда-либо видели такие запросы. Такие запросы выполняются в

стиле сверху-вниз-в середину-вниз-в середину-наверх. Первым

выполняется верхний запрос, который подготавливает список строк,

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

строке за раз. Затем выполняется средний запрос, который тоже

подготавливает список строк, для которых будет проверяться




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