複数の CTE を 1 つのクエリで組み合わせることは可能ですか?
次のような結果を得る方法を探しています:
WITH cte1 AS (
...
),
WITH RECURSIVE cte2 AS (
...
),
WITH cte3 AS (
...
)
SELECT ... FROM cte3 WHERE ...
ご覧のとおり、再帰 CTE が 1 つと非再帰 CTE が 2 つあります。
ベストアンサー1
キーワードを使用するWITH
一度先頭に。共通テーブル式(CTE)のいずれかが再帰的(rCTE)である場合は、RECURSIVE
先頭にキーワードを追加する必要があります。一度また、すべての CTE が再帰的ではない場合でも、
WITH RECURSIVE
cte1 AS (...) -- can still be non-recursive
, cte2 AS (SELECT ...
UNION ALL
SELECT ...) -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...
が指定されている場合は
RECURSIVE
、許可するSELECT
名前で自身を参照するサブクエリ。
太字は私によるものです。さらに洞察に富んだのは、
のもう一つの効果は、クエリを順序付ける必要がない
RECURSIVE
ことである。WITH
: クエリは、リスト内の後にある別のクエリを参照できます。(ただし、循環参照、つまり相互再帰は実装されていません。) がない場合RECURSIVE
、クエリはリスト内の前にあるWITH
兄弟クエリのみを参照できます。WITH
WITH
WITH
太字の強調は私によるものです。つまり、節の順序は意味がないRECURSIVE
キーワードが使用された場合。
ちなみに、例のcte1
とcte2
は外側の では参照されておらずSELECT
、SELECT
自体はプレーン コマンド (副次的な影響なし) であるため、 で参照されない限り、実行されることはありませんcte3
。