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