SQL Server 2005: обнаружение циклов в иерархических данных - PullRequest
1 голос
/ 20 марта 2009

У меня есть типичная таблица иерархических данных в формате 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'

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

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

1 Ответ

1 голос
/ 20 марта 2009

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

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

...