2009-03-20 3 views
1

У меня есть типичная таблица иерархических данных в форме id, parentId.SQL Server 2005: Обнаружение циклов в иерархических данных

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' 

Идентификаторы из другой таблицы, поэтому я не могу использовать порядок идентификаторов как часть решения. Есть около 1/2 миллиона строк. Данные представляют собой большое количество независимых деревьев высотой 1-5. Цель состоит в том, чтобы очистить данные, чтобы устранить циклы, а затем добавить триггер в таблицу для предотвращения циклов в будущем.

Я знаю thealgorithms для обнаружения циклов. Мне кажется, что это должна быть общая проблема. Итак, мне было интересно, есть ли удобный способ в поле «SQL Server» для выполнения этого с минимальным кодом.

ответ

1

Если у вас есть Sql Server 2005, вы можете использовать предложение WITH для выполнения рекурсивного запроса к вашей таблице. Это позволит вам свернуть логику, поскольку это, по-видимому, ваша основная цель.

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

Смежные вопросы