Примечания
-
Определение CTE может содержать любой правильный оператор
SELECT
, если он не содержит преамбулы “WITH…
” (операторыWITH
не могут быть вложенными); -
CTE могут использовать друг друга, но ссылки не должны иметь циклов;
-
CTE могут быть использованы в любой части главного запроса или другого табличного выражения и сколько угодно раз;
-
Основной запрос может ссылаться на CTE несколько раз, но с разными алиасами;
-
CTE могут быть использованы в операторах
INSERT
,UPDATE
иDELETE
как подзапросы; -
Если объявленное CTE не использовано, то будет выдано предупреждение “CTE cte is not used in query”. В более ранних версиях вместо предупреждения выдавалась ошибка;
-
CTE могут быть использованы и в PSQL в
FOR
циклах:FOR WITH MY_RIVERS AS ( SELECT * FROM RIVERS WHERE OWNER = 'me' ) SELECT NAME, LENGTH FROM MY_RIVERS INTO :RNAME, :RLEN DO BEGIN ... END
Примеры
WITH
DEPT_YEAR_BUDGET AS (
SELECT
FISCAL_YEAR,
DEPT_NO,
SUM(PROJECTED_BUDGET) BUDGET
FROM PROJ_DEPT_BUDGET
GROUP BY FISCAL_YEAR, DEPT_NO
)
SELECT
D.DEPT_NO,
D.DEPARTMENT,
DYB_2008.BUDGET BUDGET_08,
DYB_2009.BUDGET AS BUDGET_09
FROM
DEPARTMENT D
LEFT JOIN DEPT_YEAR_BUDGET DYB_2008
ON D.DEPT_NO = DYB_2008.DEPT_NO AND
DYB_2008.FISCAL_YEAR = 2008
LEFT JOIN DEPT_YEAR_BUDGET DYB_2009
ON D.DEPT_NO = DYB_2009.DEPT_NO AND
DYB_2009.FISCAL_YEAR = 2009
WHERE EXISTS (SELECT *
FROM PROJ_DEPT_BUDGET B
WHERE D.DEPT_NO = B.DEPT_NO)