Użyj słowa kluczowego WITH
raz na górze. Jeśli którekolwiek z Twoich wspólnych wyrażeń tabelowych (CTE) jest rekurencyjne (rCTE), musisz dodać słowo kluczowe RECURSIVE
u góry raz także, nawet jeśli nie wszystkie CTE są rekurencyjne:
WITH RECURSIVE
cte1 AS (...) -- can still be non-recursive
, cte2 AS (SELECT ...
UNION ALL
SELECT ...) -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...
Instrukcja:
Jeśli RECURSIVE
jest określony, pozwala SELECT
podzapytanie odwołuje się do siebie według nazwy.
Moje odważne podkreślenie. I jeszcze bardziej wnikliwe:
Kolejny efekt RECURSIVE
czy to WITH
zapytania nie muszą być zamawiane :zapytanie może odwoływać się do innego, które znajduje się później na liście. (Jednak odwołania cykliczne lub wzajemna rekurencja nie są zaimplementowane.) Bez RECURSIVE
, WITH
zapytania mogą odnosić się tylko do rodzeństwa WITH
zapytania, które znajdują się wcześniej w WITH
lista.
Znowu śmiały nacisk. Oznacza to, że kolejność WITH
klauzule są bez znaczenia kiedy RECURSIVE
użyto słowa kluczowego.
BTW, ponieważ cte1
i cte2
w przykładzie nie są przywoływane w zewnętrznym SELECT
i są proste SELECT
same komendy (brak efektów ubocznych), nigdy nie są wykonywane (chyba że jest do nich odwołanie w cte3
).