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 ).