SQL - обнаружение циклов в родительских и дочерних отношениях
У меня есть родительские дочерние данные в Excel, которые загружаются в стороннюю систему, работающую на сервере MS SQL. Данные представляют ориентированный (надеюсь) ациклический граф. Сторонняя сторона означает, что у меня нет полностью свободной руки в схеме. Данные Excel представляют собой объединение других файлов, и существует вероятность того, что в перекрестных ссылках между различными файлами кто-то вызвал цикл - т.е. X является потомком Y (X->Y), а затем в других местах (Y->A->BX). Я могу написать VB, VBA и т. Д. В Excel или на БД сервера SQL. Файл Excel содержит почти 30 тыс. Строк, поэтому я беспокоюсь о комбинаторном взрыве, поскольку данные будут расти. Поэтому некоторые методы, такие как создание таблицы со всеми путями, могут быть довольно громоздкими. Я имею в виду просто написать программу, которая для каждого корня выполняет обход дерева для каждого листа, и если глубина становится больше некоторого номинального значения, это указывает на это.
Лучшие предложения или указатели на предыдущее обсуждение приветствуются.
1 ответ
Вы можете использовать рекурсивный CTE для обнаружения петель:
with prev as (
select RowId, 1 AS GenerationsRemoved
from YourTable
union all
select RowId, prev.GenerationsRemoved + 1
from prev
inner join YourTable on prev.RowId = ParentRowId
and prev.GenerationsRemoved < 55
)
select *
from prev
where GenerationsRemoved > 50
Для этого необходимо указать максимальный уровень рекурсии: в этом случае CTE достигает 55 и выбирает ошибочные строки с более чем 50 дочерними элементами.