Я использую сервер MS SQL. У меня есть простая таблица с родительскими дочерними отношениями, например Родитель, Ребенок
Теперь мне нужен запрос, который доставляет каждый элемент сам по себе, все его преемники и их преемники и так далее. Пример
Parent Child
------ -----
A A1
A1 A11
A A2
A2 A21
A21 A211
Теперь результат должен выглядеть так:
Root Successor
------ ---------
A A
A A1
A A11
A A2
A A21
A A211
A1 A1
A1 A11
A11 A11
A2 A2
A2 A21
A2 A211
A21 A21
A21 A211
A211 A211
Любая идея сделать это рекурсивно на MS SQL Server с помощью sql-запроса?
Я искал в Интернете и нашел несколько решений, но не для моей проблемы. У меня никогда не было списка с корнем и всеми его преемниками, только родительский дочерний элемент для одного уровня.
Ошибка с моей стороны! Извините, приходится.


WITH CTE_AllRoots AS
(
SELECT Parent as Root FROM Table1
UNION
SELECT Child FROM Table1
)
, RCTE AS
(
SELECT Root, Root AS Successor FROM CTE_AllRoots
UNION ALL
SELECT r.Root, t.Child
FROM RCTE r
INNER JOIN Table1 t ON t.Parent = r.Successor
)
SELECT *
FROM RCTE
ORDER BY Root, Successor
Мы также могли бы использовать CROSS JOIN:
SELECT
y1.parent AS Root, y2.child AS Successor
FROM
yourtable AS y1
CROSS JOIN
yourtable AS y2
WHERE y2.child LIKE y1.parent + '%'
UNION
SELECT parent, parent FROM yourtable
UNION
SELECT child, child FROM yourtable
ORDER BY Root, Successor;
Примечание. Это может работать медленно, если в вашей таблице очень много строк из-за условия LIKE в предложении WHERE.
Я думаю, что здесь следует отдать предпочтение подходу CTE, я просто хотел показать вам другой вариант.
Что вам нужно в SQL Server, так это «Рекурсивный CTE». Google, множество примеров подобных проблем как здесь, в SO, так и в Интернете.