Учитывая следующий рекурсивный CTE (немного упрощенный для моего примера):
WITH myCTE (sort, parentid, myid, level, somedata)
AS
(
-- Anchor member definition
SELECT
CAST(ROW_NUMBER() OVER(ORDER BY o.myid) as decimal(38, 20)) as sort,
o.parentid,
o.myid,
0 as level,
o.somedata
FROM
table1 t1,
table2 t1,
datatable o
WHERE t1.somebool = 1 AND t2.id = t1.foreignid and o.foreignkey = t2.key
and o.parentid = ''
UNION ALL
-- Recursive member definition
SELECT
CAST(b.sort + (ROW_NUMBER() OVER(ORDER BY o.myid) / power(10.0, b.level + 1)) as decimal(38, 20)) as sort,
o.parentid,
o.myid,
b.level + 1,
o.somedata
FROM datatable o
INNER JOIN myCTE AS b
ON o.parentid = b.myid
Общая идея заключается в следующем: начиная с выбора элементов на основе table1 и table2, я хочу запустить запрос и в привязке я хочу найти все данные без родителя, соединить их с данными, имеющими основные элементы и родители и продолжайте копать, пока я не найду все данные. Я имею дело с деревом неизвестной глубины, хотя максимальный уровень, который я нашел, равен 7.
Полезно ли применять дополнительные ограничения к рекурсивному члену? Кажется, это работает лучше, чем больше ограничений я копирую из якоря, но разве для этого недостаточно фильтрации по "o.parentid = b.myid"?
datatable.parentidпроиндексирован? Используется ли в плане выполнения индекс? - person Martin Smith   schedule 29.05.2013