Классика баз данных - статьи

       

Вложенные запросы


Запрос может появляться как операнд предиката в форме "expression operator query". Такой запрос называется Вложенным Запросом, или Подзапросом. Если операция является одной из шести операций скалярного сравнения (=, -=, >, >=, <, <=), то подзапрос должен возвращать единственное значение. Следующий пример с использованием операции "=" был приведен в разд. 2:

SELECT NAME FROM EMPLOYEE WHERE SALARY = (SELECT AVG(SALARY) FROM EMPLOYEE)

Если операцией является IN или NOT IN, то подзапрос может возвращать множество значений. Например:

SELECT NAME FROM EMPLOYEE WHERE DEPARTMENT_NUMBER IN (SELECT DEPARTMENT_NUMBER FROM DEPARTMENT WHERE LOCATION='DENVER')

В обоих примерах подзапрос требуется вычислить только один раз. ОПТИМИЗАТОР организует вычисление подзапроса до вычисления запроса верхнего уровня. Если возвращается единственное значение, оно подставляется в запрос верхнего уровня, как если бы являлось частью исходного оператора запроса; например, если бы AVG(SAL) в первом примере вычислилось в 15000 во время выполнения, то предикат принял бы вид "SALARY = 15000". Если подзапрос может возвращать набор значений, они возвращаются в виде временного списка, внутренняя форма которого более эффективна, чем у отношения, но допускает только последовательный доступ. Если во втором примере подзапрос возвращает список (17,24), то предикат вычисляется в манере, аналогичной той, как если бы исходный предикат имел вид DEPARTMENT_NUMBER IN (17,24).

Подзапрос также может содержать предикат с подзапросом, и допускается (теоретически) произвольная глубина вложенности. Если такие подзапросы не ссылаются на столбцы таблиц блоков запросов более высокого уровня, их можно вычислять до вычисления запроса верхнего уровня. В этом случае сначала вычисляются наиболее глубоко вложенные запросы, поскольку любой подзапрос должен быть вычислен раньше, чем может быть вычислен его родительский запрос.

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

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