78

単一のクエリで複数の CTE を組み合わせることは可能arelですか? 私はこのような結果を得る方法を探しています:

WITH cte1 AS (
...
),
WITH RECURSIVE cte2 AS (
...
),
WITH cte3 AS (
...
)
SELECT ... FROM cte3 WHERE ...

ご覧のとおり、1 つの再帰 CTE と 2 つの非再帰 CTE があります。

4

4 に答える 4

149

キーワードを上部WITH に 1 回使用します。共通テーブル式 (CTE) のいずれかが再帰的 (rCTE)である場合は、すべての CTE が再帰的であるとは限りませんが、最初RECURSIVEにキーワードを追加する必要があります。

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

大胆強調鉱山。そして、さらに洞察力があります:

のもう 1 つの効果RECURSIVEは、WITHクエリを順序付けする必要がないことです。クエリは、リストの後半にある別のクエリを参照できます。(ただし、循環参照または相互再帰は実装されていません。) を使用しないRECURSIVE場合、クエリはリスト の前にあるWITH兄弟クエリのみを参照できます。WITHWITH

再び大胆な強調鉱山。キーワードが使用されている場合、WITH句の順序は無意味であることを意味します。RECURSIVE

ところで、この例では と は外部で参照されておらず、cte1それ自体が単純なコマンドであるため (付随的な影響はありません)、実行されることはありません ( で参照されている場合を除きます)。cte2SELECTSELECTcte3

于 2016-02-07T03:28:37.527 に答える
58

はい。を繰り返さないでくださいWITH。コンマを使用するだけです:

WITH cte1 AS (
...
),
     cte2 AS (
...
),
     cte3 AS (
...
)
SELECT ... FROM 'cte3' WHERE ...

And: 文字列定数と日付定数には単一引用符のみを使用します。列のエイリアスには使用しないでください。いずれにしても、CTE 名には使用できません。

于 2016-02-07T00:41:51.193 に答える