SQL - обнаружение циклов в родительских и дочерних отношениях

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

4 голоса | спросил Wudang 12 J000000Monday10 2010, 20:14:58

1 ответ


0

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

ответил Andomar 12 J000000Monday10 2010, 20:28:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132