2010-07-12 2 views
4

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

+0

Что вы хотите сделать, если обнаружен цикл? – Fosco

+0

Ваша произвольная кепка «больше уровня X = проблема» может быть неточной, если вы не знаете или не можете определить максимальную допустимую глубину. Доступна ли эта информация? –

ответ

4

Вы можете использовать рекурсивный КТР для обнаружения петель:

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 

Это потребует от вас указать максимальный уровень рекурсии: в этом случае КТР работает до 55, и он выбирает, как ошибочные строки с более 50 детей.

+0

Это в значительной степени то, что я сделал тоже. Это работает хорошо. –

+0

Я никогда не слышал о CTE, поскольку мой опыт работы с базами данных в основном представляет собой zSeries DB/2. Спасибо за указатель на них. Думаю, теперь у меня есть ответ на ряд других вопросов. – Wudang

+1

И нашел достойный учебник здесь http://msdn.microsoft.com/en-us/library/ms186243.aspx Спасибо, ребята – Wudang