再帰 CTE の行ごとの実行
再帰共通テーブル式 (CTE) は、再帰クエリを可能にする強力な SQL 構造です。これらの実行方法を理解するには、一連の UNION ALL 操作として考えてください。
提供された例を考えてみましょう:
DECLARE @tbl TABLE ( Id INT , [Name] VARCHAR(20) , ParentId INT );
行 1-2: テーブルを定義します。
行 3-16: にレコードを挿入します。 table.
行 19-24: 再帰 CTE abcd を定義します。
行 19: アンカー式は CTE の最初の反復を定義しますParentId が含まれるレコードを選択するNULL.
行 20-22: 再帰式は、子レコードを選択し、その名前を [パス] 列の親のパスと連結することによって CTE を拡張します。
25 行目: CTE abcd から選択して最終値を取得しますresult.
実行手順:
1. アンカー式 (19 行目) を実行すると、次の結果が返されます:
Id | Name | ParentId | Path |
---|---|---|---|
1 | Europe | NULL | Europe |
2 | Asia | NULL | Asia |
2. 再帰式を実行する(行 20-22) アンカー式の結果を使用します。これにより、次の結果が得られます:
Id | Name | ParentId | Path |
---|---|---|---|
3 | Germany | 1 | Europe/Germany |
4 | UK | 1 | Europe/UK |
5 | China | 2 | Asia/China |
6 | India | 2 | Asia/India |
3. 子レコードが見つからなくなるまで手順 2 を繰り返し、結果は次のようになります:
Id | Name | ParentId | Path |
---|---|---|---|
7 | Scotland | 4 | Europe/UK/Scotland |
8 | Edinburgh | 7 | Europe/UK/Scotland/Edinburgh |
9 | Leith | 8 | Europe/UK/Scotland/Edinburgh/Leith |
4. 各反復からのすべての結果を結合して、SELECT ステートメントに示されている最終結果を取得します (行25).
アンカーが繰り返されない理由:
アンカー式は再帰の最初の開始点を定義します。これは各反復で実行されますが、結果セットを拡張する再帰式とは異なります。したがって、アンカー レコードは 1 回だけ含まれます。
以上が再帰的 CTE は行ごとにどのように実行されるか: 段階的な説明?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。