Получить root и всех преемников из родительской дочерней таблицы на SQL Server

Я использую сервер 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-запроса?

Я искал в Интернете и нашел несколько решений, но не для моей проблемы. У меня никогда не было списка с корнем и всеми его преемниками, только родительский дочерний элемент для одного уровня.

Что вам нужно в SQL Server, так это «Рекурсивный CTE». Google, множество примеров подобных проблем как здесь, в SO, так и в Интернете.

Nenad Zivkovic 23.11.2022 16:44

Ошибка с моей стороны! Извините, приходится.

Dirk 23.11.2022 17:17
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
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, я просто хотел показать вам другой вариант.

дб<>рабочий пример

Другие вопросы по теме