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 дочерними элементами.

Другие вопросы по тегам