Отображение данных многоуровневой иерархии в SQL Server Management Studio

Я хочу последовательно получить многоуровневую иерархию. У меня есть таблица BOMHierarchy, в которой у меня есть эти образцы данных:

Родитель Ребенок Родитель1 Ребенок1 Родитель1 ребенок2 Ребенок1 Ребенок3 Ребенок1 Ребенок4 Ребенок3 Ребенок5 Ребенок3 Ребенок6

Я хочу показать приведенные выше данные, как показано ниже, в правильном иерархическом порядке:

Родитель Ребенок Родитель1 Ребенок1 Ребенок1 Ребенок3 Ребенок3 Ребенок5 Ребенок3 Ребенок6 Ребенок1 Ребенок4 Родитель1 Ребенок2

Я застрял в получении этих последовательных данных в соответствии с иерархией. Кто-нибудь может предложить решение?

Я пробовал использовать CTE и цикл while, но не получил требуемого результата.

«Я пытался использовать CTE и цикл while, но не получил требуемого результата». Что это были за попытки? Почему они не работали?

Larnu 10.02.2023 17:12

Кстати, почему вы все еще используете SSMS 2012? SSMS 19 вышла в прошлом месяце и по-прежнему поддерживает такие старые версии, как SQL Server 2008 (не то чтобы SQL Server 2008-2012 фактически являются поддерживаемыми версиями SQL Server).

Larnu 10.02.2023 17:12

@Larnu, это был ошибочный тег, не могу найти SSMS19 в тегах. ржу не могу. также ответ на ваш первый комментарий: я повторил таблицу и попытался поместить одну запись во временную таблицу за раз, она работает только на уровне 2, она не учитывает данные уровня 3 или более. Я получаю o/p, как показано ниже Parent1-child1, child1-child3, child3-child4

Kantarkatax 10.02.2023 17:19
Отредактируйте свой вопрос, чтобы показать эту попытку.
Larnu 10.02.2023 17:30

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

Ben Thul 10.02.2023 22:45
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже на классическую задачу рекурсивного сканирования дерева. В SQL все просто, вам просто нужно создать правильный ORDER BY. Попробуйте что-нибудь вроде этого

DECLARE @BOM table (Parent varchar(20), Child varchar(20))

INSERT INTO @BOM(Parent, Child)
VALUES ('Parent1', 'Child1'),
       ('Parent1', 'Child2'),
       ('Child1', 'Child3'), ('Child1', 'Child4'),
       ('Child3', 'Child5'), ('Child3', 'Child6')

-- find all possible combinations recursively 
;WITH cte AS 
( 
    SELECT 
        Parent, Child,  
        CONVERT(VARCHAR(MAX),Parent + '|' + Child) Chain
    FROM 
        @BOM root
    WHERE 
        NOT EXISTS (SELECT 1 
                    FROM @BOM NotRoot
                    WHERE root.Parent = NotRoot.Child)
    UNION ALL 
    SELECT 
        BOM.Parent, BOM.Child, cte.Chain + '|' + CONVERT(VARCHAR(MAX), BOM.Child) Chain
    FROM 
        cte 
    INNER JOIN 
        @BOM BOM ON cte.Child = BOM.Parent
)
SELECT 
    Parent, Child
FROM
    cte
ORDER BY 
    Chain

Именно то, что мне было нужно. Искренне благодарю вас за ваши усилия. Пометил ваш ответ как принятый.

Kantarkatax 10.02.2023 18:13

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