Frage

Ich habe eine typische Tabelle von hierarchischen Daten in id, parentId Form.

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');

Ich brauche Zyklen wie unten in den vorhandenen Daten zu erfassen.

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

Die Ids sind aus einer anderen Tabelle, so kann ich nicht Ordnung des Ids als Teil der Lösung verwenden. Es gibt etwa 1/2 Million Zeilen. Die Daten sind eine große Anzahl von unabhängigen Bäumen der Höhe 1-5. Die Absicht ist es, die Daten zu bereinigen, um die Zyklen zu eliminieren dann einen Trigger auf die Tabelle in den Zyklen in Zukunft zu verhindern.

Ich weiß href="https://stackoverflow.com/questions/621229/detect-cycles-in-a-binary-tree-during-a-depth-first-search"> Algorithmen für-Zyklus-Erkennung. Es scheint mir, als wäre es ein häufiges Problem sein soll. Also, ich habe mich gefragt, ob es eine praktische Möglichkeit, in der SQL Server `Box‘ war dies der Code mit einem Minimum zu erreichen.

War es hilfreich?

Lösung

Wenn Sie SQL Server 2005 haben, können Sie die Mit-Klausel verwenden, um eine rekursive Abfrage für Ihre Tabelle zu tun. Auf diese Weise können Sie die Logik zum Einsturz, wie das scheint Ihr primäres Ziel zu sein.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top