ホームページ > データベース > mysql チュートリアル > 再帰的 CTE は、ネストされた UNION ALL 操作を段階的にどのように実行しますか?

再帰的 CTE は、ネストされた UNION ALL 操作を段階的にどのように実行しますか?

Linda Hamilton
リリース: 2024-12-26 14:58:09
オリジナル
929 人が閲覧しました

How Does a Recursive CTE Execute Its Nested UNION ALL Operations Step-by-Step?

再帰的 CTE の実行方法 (行ごと)

再帰的 CTE (一般に階層クエリと呼ばれます) は、情報を走査して抽出するために使用されます。ツリー状のデータ構造から。これらのクエリがどのように実行されるかを理解するのは難しい場合があります。

再帰的 CTE は、次のような一連のネストされた UNION ALL 操作として動作します。

WITH abcd1 AS
(
    SELECT *
    FROM @tbl
    WHERE ParentID IS NULL
)
UNION ALL
WITH abcd2 AS
(
    SELECT t.*
    FROM abcd1
    JOIN @tbl t
    ON t.ParentID = abcd1.id
)
UNION ALL
WITH abcd3 AS
(
    SELECT t.*
    FROM abcd2
    JOIN @tbl t
    ON t.ParentID = abcd2.id
)
...
ログイン後にコピー

再帰的メンバー ブロックの各反復により、前の反復をベーステーブルと結合することにより、新しい結果セットが作成されます。このプロセスは、行が返されないことで判断される停止条件が満たされるまで続行されます。

この例では、

  1. Anchor (SELECT ... ):

    • null の ParentID を持つ @tbl テーブルからレコードを取得します。階層のルート。
  2. 再帰メンバー (SELECT ...):

    • 現在の反復を結合します。 ParentID 列に基づいてベース テーブルを作成し、効率的に
  3. パス計算:

    • 前の反復からの Path 列を現在の Name と連結し、階層的なpath.
  4. 反復 (UNION ALL):

    • アンカー ブロックと再帰メンバー ブロックの結果を結合し、次の新しい結果セットiteration.
  5. 選択 (SELECT * FROM abcd):

    • すべてのノードを含む最終結果セットを表示しますおよびそれぞれの階層paths.

アンカーは後続の反復でスキップされないことに注意することが重要です。代わりに、これは各再帰メンバーが階層を探索するための開始点として機能します。最終結果の重複を防ぐために、一意の識別子 (パス) を使用して、階層内の異なるレベルに存在する同じ名前のレコードを区別します。

以上が再帰的 CTE は、ネストされた UNION ALL 操作を段階的にどのように実行しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート