CTE-Hinweise
-
Eine CTE-Definition kann jede zulässige
SELECT
-Anweisung enthalten, solange sie keine eigene “WITH…
”-Präambel hat (keine Verschachtelung). -
CTEs, die für dieselbe Hauptabfrage definiert sind, können aufeinander verweisen, aber es sollte darauf geachtet werden, Schleifen zu vermeiden.
-
CTEs kann von überall in der Hauptabfrage referenziert werden.
-
Jeder CTE kann in der Hauptabfrage mehrfach referenziert werden, ggf. mit unterschiedlichen Aliasnamen.
-
In Klammern eingeschlossen können CTE-Konstrukte als Unterabfragen in
SELECT
-Anweisungen, aber auch inUPDATE
s,MERGE
s usw. verwendet werden. -
In PSQL werden CTEs auch in
FOR
-Schleifenheadern unterstützt:for with my_rivers as (select * from rivers where owner = 'me') select name, length from my_rivers into :rname, :rlen do begin .. end
Beispiele
with dept_year_budget as (
select fiscal_year,
dept_no,
sum(projected_budget) as budget
from proj_dept_budget
group by fiscal_year, dept_no
)
select d.dept_no,
d.department,
dyb_2008.budget as 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
);