2012-06-22 3 views
2

Я могу сгенерировать иерархию с рекурсивным CTE, но я всегда использовал якорь ... запись верхнего уровня с индикатором верхнего уровня (parentID IS NULL) , Я хотел бы создать иерархию, которая не обязательно имеет определенный якорь. У меня есть много-много справочной таблицы с parentID и childID. Любой родитель может быть ребенком и наоборот (избегая, разумеется, круговой ссылки). Я думаю, что это будет скорее подход «снизу вверх», а не сверху вниз. Мысли?SQL Server: Иерархия рекурсивная CTE без привязки

+0

Я бы хотел увидеть образец того, что у вас есть. Возможно, примеры используемых структур и попытки вы в настоящее время работаете. Вот [хорошее место] (http://sqlfiddle.com/#!3/8ecfd/13), чтобы добавить примеры для людей, с которыми можно играть. – whytheq

+0

Если вы попытаетесь использовать рекурсивные CTE, тогда они будут работать вечно. Ну, за исключением того, что MAXRECURSION установлено на другое значение. Я подозреваю, что вам нужен алгоритм ходьбы по графику, который отслеживает уже посещенные узлы. Я не уверен, как реализовать такого зверя с помощью CTE. –

+0

Если я работаю с одним childiID и поставляю childID, этот запрос будет по крайней мере строить иерархию снизу вверх: с c as ( выберите 0 как lvl, a.parentid, a.childid из dbo.ParentChild a где childid = 1 объединение всех выберите LVL + 1, b.parentid, b.childid из dbo.ParentChild б присоединиться к с на c.parentid = b.childid) выбрать отличный от * с заказ по лвл, ParentId , childid; –

ответ

3

Вы не можете построить рекурсивный запрос, используя CTE, не имея хотя бы одного элемента привязки и одного рекурсивного элемента.

Хотя рекурсивный CTE используется для генерации иерархии, проблема в этом случае заключается в том, что данные в таблице не представляют собой иерархию, поскольку иерархия является типом направленного ациклического графа, поэтому она должна иметь один элемент (иерарх), который превосходит все остальные элементы.

Смежные вопросы