Я хочу последовательно получить многоуровневую иерархию. У меня есть таблица BOMHierarchy
, в которой у меня есть эти образцы данных:
Я хочу показать приведенные выше данные, как показано ниже, в правильном иерархическом порядке:
Я застрял в получении этих последовательных данных в соответствии с иерархией. Кто-нибудь может предложить решение?
Я пробовал использовать CTE и цикл while, но не получил требуемого результата.
Кстати, почему вы все еще используете SSMS 2012? SSMS 19 вышла в прошлом месяце и по-прежнему поддерживает такие старые версии, как SQL Server 2008 (не то чтобы SQL Server 2008-2012 фактически являются поддерживаемыми версиями SQL Server).
@Larnu, это был ошибочный тег, не могу найти SSMS19 в тегах. ржу не могу. также ответ на ваш первый комментарий: я повторил таблицу и попытался поместить одну запись во временную таблицу за раз, она работает только на уровне 2, она не учитывает данные уровня 3 или более. Я получаю o/p, как показано ниже Parent1-child1, child1-child3, child3-child4
В зависимости от того, как часто вам нужно определять иерархию, возможно, стоит сохранить ее с типом данных иерархии. Я сделал довольно обширную запись о том, как это сделать здесь.
Похоже на классическую задачу рекурсивного сканирования дерева. В 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
Именно то, что мне было нужно. Искренне благодарю вас за ваши усилия. Пометил ваш ответ как принятый.
«Я пытался использовать CTE и цикл while, но не получил требуемого результата». Что это были за попытки? Почему они не работали?