ホームページ >データベース >mysql チュートリアル >SQL Server 2005 の自己参照テーブルから階層データを効率的に取得するにはどうすればよいですか?

SQL Server 2005 の自己参照テーブルから階層データを効率的に取得するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-25 08:48:11293ブラウズ

How Can I Efficiently Retrieve Hierarchical Data from a Self-Referencing Table in SQL Server 2005?

SQL Server 2005 での階層データの移動

SQL Server 2005 からの階層データの取得は、特に自己参照を扱う場合に困難になることがあります。子レコードが親の ID を指すテーブル。ビューと複雑なクエリは一般的に使用されますが、多くの場合、優雅さや効率性に欠けます。

1 つのソリューションでは、共通テーブル式 (CTE) を利用して階層構造を構築し、各項目のパスを生成します。このアプローチには、Parent という名前の CTE の作成が含まれます。これは、ルート ノード (ParentID は NULL) とその名前をパスとして選択することから始まります。次に、子ノードを再帰的に追加し、その名前を親パスに連結します。

次のコードは、このアプローチを示しています。

CREATE TABLE tblHierarchy (ID int, ParentID int NULL, Name varchar(128));

INSERT INTO tblHierarchy VALUES (1, NULL, '1');
INSERT INTO tblHierarchy VALUES (2, NULL, '2');
INSERT INTO tblHierarchy VALUES (3, NULL, '3');
INSERT INTO tblHierarchy VALUES (4, 1, '1.1');
INSERT INTO tblHierarchy VALUES (5, 1, '1.2');
INSERT INTO tblHierarchy VALUES (6, 4, '1.1.1');

WITH Parent AS
(
    SELECT
        ID,
        ParentID,
        Name AS Path
    FROM
        tblHierarchy
    WHERE
        ParentID IS NULL

    UNION ALL

    SELECT
        TH.ID,
        TH.ParentID,
        CONVERT(varchar(128), Parent.Path + '/' + TH.Name) AS Path
    FROM
        tblHierarchy TH
    INNER JOIN
        Parent
    ON
        Parent.ID = TH.ParentID
)
SELECT * FROM Parent

この CTE は、追加の列 Path を持つ階層テーブルを作成します。各ノードへの完全なパス。結果のクエリ出力は次のようになります。

ID  ParentID    Path
1   NULL        1
2   NULL        2
3   NULL        3
4   1       1/1.1
5   1       1/1.2
6   4       1/1.1/1.1.1

このアプローチは、SQL Server 2005 の自己参照テーブルから階層データを取得するクリーンで効率的な方法を提供します。これにより、複雑な手動クエリの必要性がなくなり、次のことが可能になります。階層のナビゲーションが簡単になりました。

以上がSQL Server 2005 の自己参照テーブルから階層データを効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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