Используя предложение WITH
, напишите запрос для отображения названий отделов и совокупного оклада для отделов, совокупный оклад в которых больше среднего оклада по отделам.
Задача, демонстрируемая на рисунке, потребует следующих промежуточных вычислений:
- Расчет совокупного оклада для каждого отдела и сохранение результата с помощью предложения WITH.
- Расчет среднего оклада по отделам и сохранение результата с помощью предложения
WITH
. - Сравнение совокупного оклада, рассчитанного на первом шаге, со средним окладом, рассчитанным на втором шаге. Если совокупный оклад для конкретного отдела больше среднего оклада по отделам, тогда название этого отдела и совокупный оклад для этого отдела выводятся на экран.
Решение этой задачи показано на следующей странице.
Программный код SQL, показанный на рисунке, представляет собой пример ситуации, в которой скорость выполнения и написания SQL можно повысить более простым путем с помощью предложения WITH
. Запросом создаются имена запросов DEPT_COSTS
и AVG_COST
, а затем они вставляются в тело главного запроса. Внутри запроса предложение WITH
раскладывается как встроенное представление или временная таблица.
Оптимизатором выбирается подходящее решение в зависимости от достоинств или недостатков временного хранения результатов предложения WITH
.
Программным кодом SQL, показанным на рисунке, генерируются следующие выходные данные:
Примечания к использованию предложения WITH
- Используется только с инструкциями
SELECT
. - Имя запроса отображается для всех блоков запроса элемента
WITH
(включая блоки их подзапросов), определенных после него и самого блока главного запроса (включая блоки его подзапросов). - Когда имя запроса совпадает с именем существующей таблицы, синтаксический анализатор производит поиск изнутри наружу, а имя блока запроса имеет приоритет над именем таблицы.
- Предложение
WITH
может содержать более одного запроса. В этом случае каждый запрос отделяется запятой.
Далее: Примеры регулярных выражений и проверочных ограничений