Notes
-
Une définition CTE peut contenir n’importe quel instruction
SELECT
valide tant qu’elle ne contient pas le préambule “`WITH…`” (les instructionsWITH
ne peuvent pas être imbriqués) ; -
Les CTE peuvent s’utiliser mutuellement, mais les références ne doivent pas comporter de boucles ;
-
CTE peut être utilisé dans n’importe quelle partie de la requête principale ou autre expression tabulaire et autant de fois que souhaité ;
-
La requête principale peut faire référence à un CTE plusieurs fois, mais avec des alias différents ;
-
Les CTE peuvent être utilisés dans les instructions
INSERT
,UPDATE
etDELETE
comme sous-requêtes ; -
Si le CTE déclaré n’est pas utilisé, un message d’avertissement “CTE cte is not used in query” sera émis. Dans les versions antérieures, une erreur était émise au lieu d’un avertissement ;
-
Les CTE peuvent également être utilisés dans PSQL dans les boucles
FOR
:FOR WITH MY_RIVERS AS ( SELECT * FROM RIVERS WHERE OWNER = 'me' ) SELECT NAME, LENGTH FROM MY_RIVERS INTO :RNAME, :RLEN DO BEGIN ... END
Exemples
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)