1 つの SQL クエリで複数の CTE を使用するにはどうすればよいでしょうか? 質問する

1 つの SQL クエリで複数の CTE を使用するにはどうすればよいでしょうか? 質問する

複数の 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兄弟クエリのみを参照できます。WITHWITH

WITH太字の強調は私によるものです。つまり、節の順序は意味がないRECURSIVEキーワードが使用された場合。

ちなみに、例のcte1cte2は外側の では参照されておらずSELECTSELECT自体はプレーン コマンド (副次的な影響なし) であるため、 で参照されない限り、実行されることはありませんcte3

おすすめ記事