再帰的 CTE は行ごとにどのように実行されますか?
再帰的 CTE は、無限の UNION ALL と同様に、基本ケースと複数のケースで構成されます。再帰呼び出し。次の点を考慮してください:
WITH rows AS ( SELECT * FROM mytable WHERE anchor_condition ), rows2 AS ( SELECT * FROM set_operation(mytable, rows) ), rows3 AS ( SELECT * FROM set_operation(mytable, rows2) ), … SELECT * FROM rows UNION ALL SELECT * FROM rows2 UNION ALL SELECT * FROM rows3 UNION ALL …
提供された例では:
WITH abcd1 AS ( SELECT * FROM @tbl t WHERE ParentId IS NULL ), abcd2 AS ( SELECT t.* FROM abcd1 JOIN @tbl t ON t.ParentID = abcd1.id ), abcd3 AS ( SELECT t.* FROM abcd2 JOIN @tbl t ON t.ParentID = abcd2.id ), abcd4 AS ( SELECT t.* FROM abcd3 JOIN @tbl t ON t.ParentID = abcd3.id ), abcd5 AS ( SELECT t.* FROM abcd4 JOIN @tbl t ON t.ParentID = abcd4.id ), abcd6 AS ( SELECT t.* FROM abcd5 JOIN @tbl t ON t.ParentID = abcd5.id ) SELECT * FROM abcd1 UNION ALL SELECT * FROM abcd2 UNION ALL SELECT * FROM abcd3 UNION ALL SELECT * FROM abcd4 UNION ALL SELECT * FROM abcd5 UNION ALL SELECT * FROM abcd6
各アンカーの反復により新しい再帰呼び出しが生成され、ネストされたレイヤーのセットが作成されます。アンカーは 1 回呼び出され、開始点として機能します。後続の反復では、前の呼び出しの結果を使用して再帰メンバーを設定します。
abcd6 は結果を返さないため、停止条件を意味します。理論的には、再帰的 CTE は無限になる可能性がありますが、SQL Server ではレコードセットが無限にならないように制限を適用しています。
詳細については、次の記事を参照してください。
以上が再帰的 CTE はどのように段階的に実行されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。