2015-01-20 3 views
-1

У меня есть этот оригинальный стол:преобразования таблицы иерархии в мост

IF OBJECT_ID('tempdb..#Hierarchies') IS NOT NULL DROP TABLE #Hierarchies 

CREATE TABLE #Hierarchies 
    (
     [HierarchyId] [INT] NOT NULL , 
     [HierarchyName] NVARCHAR(MAX), 
     [ParentHierarchyId] [INT] 
     CONSTRAINT [PK_Hierarchies] 
     PRIMARY KEY CLUSTERED ([HierarchyId] ASC) 
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
       IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
       ALLOW_PAGE_LOCKS = ON) 
    ) 
ON [PRIMARY] 

INSERT INTO #Hierarchies ([HierarchyId], [HierarchyName], [ParentHierarchyId]) 
SELECT 1 , 'A', NULL 
UNION ALL 
SELECT 2 , 'B', 1 
UNION ALL 
SELECT 3 , 'C', 1 
UNION ALL 
SELECT 4 , 'D', 2 

SELECT * FROM #Hierarchies 

SELECT 
    b.HierarchyId, 
    a.HierarchyId 
FROM #Hierarchies a 
CROSS JOIN 
#Hierarchies b 
ORDER BY b.HierarchyId 

и хотел бы преобразовать его в этот формат:

ParentId ChildId LevelsRemoved 
1 1 0 
1 2 1 
1 3 1 
1 4 2 
2 2 0 
2 4 1 
3 3 0 

Перед тем, как попытаться реализовать колесо, я задавался вопросом, если кто-то может быть таким добрым и указать мне на существующий sql-скрипт для этого? Благодарю.

+0

Что означает LevelsRemoved Column? –

+0

Ваш желаемый результат не совсем ясен для меня. Что ты пытаешься сделать? Вы когда-нибудь рассматривали использование вложенных наборов вместо этого типа списка смежности? С ними гораздо легче работать. –

+0

Да, я использовал этот и рекурсивный CTE, но мне нужен он в этом формате (так называемый шаблон моста в мире мер). – cs0815

ответ

0

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

WITH Descendant AS(
    SELECT HierarchyId AS ParentId, HierarchyId As ChildId, 0 AS LevelsRemoved 
    FROM #Hierarchies 

    UNION ALL 

    SELECT D.ParentId, H.HierarchyId AS ChildId, D.LevelsRemoved + 1 AS LevelsRemoved 
    FROM Descendant D 
    JOIN Hierarchies H ON D.ChildId = H.ParentHierarchyId 
) 
SELECT * FROM Descendant 
+0

Спасибо. Да, это будет частью трансформации. Btw, форматирование немного неудобно (-: – cs0815

Смежные вопросы