ホームページ >データベース >mysql チュートリアル >SQL Server の再帰 CTE はカテゴリとその祖先パスをどのように取得できますか?

SQL Server の再帰 CTE はカテゴリとその祖先パスをどのように取得できますか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-15 11:30:44565ブラウズ

How Can Recursive CTEs in SQL Server Retrieve a Category and its Ancestor Path?

SQL Server の再帰共通テーブル式 (CTE) を使用した自己参照クエリ

はじめに

リレーショナル データベースでは、自己参照クエリは、単一テーブル内の階層関係を横断するための強力な手法です。 SQL Server はこの目的のために共通テーブル式 (CTE) を提供し、効率的で表現力豊かな再帰クエリを可能にします。

質問

ID、Name、ParentId 列を含む単純化された「Category」テーブルを考えてみましょう。次の例に示すように、テーブルはカテゴリの不定階層をサポートしています:

<code>Id     Name       ParentId
1      Business   NULL
2      Laptops    1
3      Asus       2</code>

目標は、指定されたカテゴリ (「ビジネス ラップトップ」など) を取得するだけでなく、そのすべての親カテゴリのカンマ区切りリストも提供するクエリを構築することです。

解決策: 再帰的 CTE

この問題を解決するには、再帰的 CTE を使用できます。最も外側の CTE は再帰の開始点を定義し、再帰項は拡張階層のロジックを定義します:

<code>WITH CTE AS (
    SELECT Id, Name, Name AS Path, ParentId
    FROM Categories 
    WHERE ParentId IS NULL
    UNION ALL
    SELECT t.Id, t.Name, cast(cte.Path + ',' + t.Name as varchar(100)), t.ParentId
    FROM Categories t
    INNER JOIN CTE ON t.ParentId = CTE.Id
)</code>

クエリ

指定されたカテゴリとその親カテゴリを取得するには、単純なクエリを使用します。

<code>SELECT Id, Name, Path
FROM CTE
WHERE Name = 'Business Laptops'</code>

結果

クエリは次の結果を返します:

<code>Id     Name       Path
2      Laptops    Business,Laptops</code>

この例では、「Business Laptops」は「Business」の子である「Laptops」の子です。 「パス」列には、ルート カテゴリに戻る完全な階層パスが表示されます。

結論

SQL Server の再帰 CTE は、テーブル内の階層関係をナビゲートするための洗練された効率的な方法を提供します。再帰の力を活用することで、複雑なクエリを構築して、階層データ構造から貴重な洞察を抽出できます。

以上がSQL Server の再帰 CTE はカテゴリとその祖先パスをどのように取得できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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