SQL - обнаружение циклов в родительских и дочерних отношениях - PullRequest
4 голосов
/ 12 июля 2010

У меня есть родительские дочерние данные в Excel, которые загружаются в стороннюю систему, работающую на сервере MS SQL.Данные представляют ориентированный (надеюсь) ациклический граф.Сторонний означает, что у меня нет полностью свободной руки в схеме.Данные Excel представляют собой объединение других файлов, и существует вероятность, что в перекрестных ссылках между различными файлами кто-то вызвал цикл - то есть X является потомком Y (X-> Y), а затем в других местах (Y-> A-> BX).Я могу написать VB, VBA и т. Д. В Excel или на БД SQL-сервера.Файл Excel содержит почти 30 тыс. Строк, поэтому я беспокоюсь о комбинаторном взрыве, поскольку данные будут расти.Поэтому некоторые методы, такие как создание таблицы со всеми путями, могут быть довольно громоздкими.Я думаю просто написать программу, которая для каждого корня выполняет обход дерева для каждого листа, и если глубина становится больше некоторого номинального значения, это помечается.
Приветствуются лучшие предложения или указатели на предыдущее обсуждение.

1 Ответ

4 голосов
/ 12 июля 2010

Вы можете использовать рекурсивный 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 дочерними элементами.

...