階層データ構造のナビゲーションは複雑になる場合があります。 SQL Server の再帰共通テーブル式 (CTE) は、自己結合を使用してこれらのツリー状構造を横断するための強力なソリューションを提供します。
カテゴリ テーブルなどの典型的な階層データ モデルを考えてみましょう。
<code class="language-sql">CREATE TABLE Categories ( Id int PRIMARY KEY, Name nvarchar(MAX), ParentId int FOREIGN KEY REFERENCES Categories(Id) );</code>
この設計により、任意の深さのネストされたカテゴリが可能になります。 この階層を視覚化すると (以下に示すように)、標準 SQL クエリで完全なリネージュを取得することの難しさが浮き彫りになります。
[カテゴリ階層の画像を挿入]
再帰的 CTE は、この問題をエレガントに解決します。次のクエリは、カテゴリとその祖先全体を取得する方法を示しています:
<code class="language-sql">WITH RecursiveCategoryCTE AS ( SELECT c.Id, c.Name, CAST(c.Name AS nvarchar(MAX)) AS Path FROM Categories AS c WHERE c.ParentId IS NULL UNION ALL SELECT t.Id, t.Name, CAST(r.Path + ',' + t.Name AS nvarchar(MAX)) AS Path FROM RecursiveCategoryCTE AS r JOIN Categories AS t ON t.ParentId = r.Id ) SELECT c.Id, c.Name, c.Path FROM RecursiveCategoryCTE AS c WHERE c.Name = 'Business Laptops';</code>
RecursiveCategoryCTE
は、ルート カテゴリ (ParentId
は NULL) を選択することから始まります。Categories
テーブルに結合し、Path
列を構築して祖先名を蓄積します。SELECT
ステートメントは、ターゲット カテゴリ (「ビジネス ラップトップ」) とその生成された祖先パスをフィルターします。結果は次のようになります:
Id | Name | Path |
---|---|---|
12 | Business Laptops | Computers,Laptops,Business Laptops |
このテクニックは、次のような多くのアプリケーションで役立ちます。
このアプローチは、SQL Server 内の階層データをナビゲートするための簡潔で効率的な方法を提供します。
以上がSQL Server の再帰的自己結合はどのようにして階層データを効率的に取得できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。