ホームページ >データベース >mysql チュートリアル >SQL Server で再帰的自己結合を使用してカテゴリとその祖先を取得する方法

SQL Server で再帰的自己結合を使用してカテゴリとその祖先を取得する方法

DDD
DDDオリジナル
2025-01-15 11:44:44401ブラウズ

How to Retrieve a Category and Its Ancestors Using Recursive Self-Join in SQL Server?

SQL Server で再帰的自己結合を使用してカテゴリとその祖先を取得する

この記事では、再帰的自己結合を使用して、SQL Server の階層テーブルからカテゴリとその祖先カテゴリを取得する方法を説明します。 このタスクには共通テーブル式 (CTE) を使用します。

シナリオ:

階層カテゴリ構造を表す CategoriesId、および Name 列を含む ParentId テーブルについて考えます。 目標は、特定のカテゴリ (例: 「ビジネス ラップトップ」) とそのすべての親カテゴリを単一のカンマ区切り文字列で返すクエリを作成することです。

再帰的 CTE ソリューション:

このソリューションでは、再帰的 CTE を使用して階層構造を横断します。 クエリは次のとおりです:

<code class="language-sql">WITH CategoryHierarchy AS (
    SELECT id, name, CAST(name AS VARCHAR(MAX)) AS path, parent_id
    FROM Categories
    WHERE parent_id IS NULL  -- Start with root categories
    UNION ALL
    SELECT c.id, c.name, CAST(ch.path + ',' + c.name AS VARCHAR(MAX)), c.parent_id
    FROM Categories c
    INNER JOIN CategoryHierarchy ch ON c.parent_id = ch.id
)</code>

この CTE、CategoryHierarchy は、Categories テーブルをそれ自体に再帰的に結合します。最初の SELECT ステートメントは、ルート カテゴリ (parent_id が NULL であるカテゴリ) を選択します。 UNION ALL は、これを後続の再帰選択と組み合わせ、親カテゴリ名と子カテゴリ名を連結して path 文字列を構築します。

特定のカテゴリと祖先を取得するクエリ:

「ビジネス ラップトップ」カテゴリとその祖先を取得するには:

<code class="language-sql">SELECT id, name, path
FROM CategoryHierarchy
WHERE name = 'Business Laptops';</code>

テーブルとデータの例:

サンプル Categories テーブルを作成し、データを挿入してみましょう:

<code class="language-sql">CREATE TABLE Categories (
    Id INT PRIMARY KEY,
    Name VARCHAR(100),
    ParentId INT REFERENCES Categories(Id)
);

INSERT INTO Categories (Id, Name, ParentId)
VALUES
(1, 'Electronics', NULL),
(2, 'Laptops', 1),
(3, 'Desktops', 1),
(4, 'Business Laptops', 2),
(5, 'Gaming Laptops', 2);</code>

期待される結果:

「ビジネス ラップトップ」をターゲットとするクエリの場合、予想される出力は次のようになります:

<code>id      name                path
4       Business Laptops     Electronics,Laptops,Business Laptops</code>

このアプローチは、再帰 CTE を使用してカテゴリとその完全な系統を効果的に取得し、SQL Server の階層データをナビゲートするための明確で効率的なソリューションを提供します。 カテゴリ名がこの制限を超える可能性がある場合は、VARCHAR(MAX) の長さを忘れずに調整してください。

以上がSQL Server で再帰的自己結合を使用してカテゴリとその祖先を取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。