1

ID、parentId 形式の階層データの典型的なテーブルがあります。

CREATE TABLE Hierarchy (Id int, ParentId int NULL, Name varchar(128));
INSERT INTO Hierarchy VALUES (1, NULL, '1');
INSERT INTO Hierarchy VALUES (2, NULL, '2');
INSERT INTO Hierarchy VALUES (3, NULL, '3');
INSERT INTO Hierarchy VALUES (4, 1, '1.1');
INSERT INTO Hierarchy VALUES (5, 1, '1.2');
INSERT INTO Hierarchy VALUES (6, 4, '1.1.1');

既存のデータで以下のようなサイクルを検出する必要があります。

Id  ParentId  Name
27  8         'foo'
8   19        'bar'
19  27        'busted'

Id は別のテーブルからのものであるため、ソリューションの一部として Id の順序付けを使用することはできません。約 1/2 百万行あります。データは、高さ 1 ~ 5 の多数の独立したツリーです。その意図は、データをクリーンアップしてサイクルを排除し、トリガーをテーブルに追加して将来のサイクルを防ぐことです。

サイクル検出 アルゴリズムを知っています。それは一般的な問題であるべきだと私には思えます。そこで、最小限のコードでこれを実現する便利な方法が SQL Server の「ボックス」にあるのではないかと考えていました。

4

1 に答える 1

1

Sql Server 2005 を使用している場合は、With 句を使用して、テーブルに対して再帰クエリを実行できます。これにより、ロジックを折りたたむことができます。これが主な目標のようです。

http://blogs.msdn.com/craigfr/archive/2007/10/25/recursive-ctes.aspx

于 2009-03-20T16:38:33.400 に答える