単一クエリで複数のCTEをarel
と組み合わせることは可能ですか?私はこのような結果を得る方法を探しています:
WITH 'cte1' AS (
...
),
WITH RECURSIVE 'cte2' AS (
...
),
WITH 'cte3' AS (
...
)
SELECT ... FROM 'cte3' WHERE ...
ご覧のように、1つの再帰CTEと2つの非再帰があります。
上部のキーワードWITH
onceを使用します。共通テーブル式(CTE)のいずれかが再帰的(rCTE)である場合、すべてのCTEが再帰的でなくても、キーワードRECURSIVE
を先頭onceに追加する必要があります。
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
のもう1つの効果は、WITH
クエリを順序付ける必要がないことです:クエリはリスト内の別のクエリを参照できます。 (ただし、循環参照、または相互再帰は実装されていません。)RECURSIVE
がない場合、WITH
クエリは、WITH
リストの前にある兄弟WITH
クエリのみを参照できます。
大胆な強調鉱山。 WITH
句の順序は、RECURSIVE
キーワードが使用されている場合、meaninglessであることを意味します。
ところで、例のcte1
とcte2
は外側のSELECT
で参照されておらず、プレーンなSELECT
コマンド自体であるため(副次的な効果はありません)、実行されません(ただし、 cte3
)で参照されます。
はい。 WITH
を繰り返さないでください。コンマを使用するだけです:
WITH cte1 AS (
...
),
cte2 AS (
...
),
cte3 AS (
...
)
SELECT ... FROM 'cte3' WHERE ...
および:文字列定数と日付定数には単一引用符のみを使用します。列のエイリアスには使用しないでください。とにかくCTE名には使用できません。