Преобразование родительской / дочерней таблицы в таблицу размеров с фиксированным столбцом - PullRequest
0 голосов
/ 26 октября 2010

У меня есть реляционная таблица (id, parentId, name)

, который я хотел бы преобразовать в сплюснутую таблицу размеров

(id, Уровень1, Уровень2, Уровень3, Уровень4)

Я исправляю глубину на глубине 4.

Я сделал успехи с рекурсивным CTE и pivot, но набор результатов не верен

Я получаю

Id  Name   Level1 Level2
0   Root   NULL   NULL
1   NULL   L1     NULL

но мне нужно

Id  Name   Level1 Level2
0   Root   NULL   NULL
1   Root   L1     NULL

вот что у меня на сегодняшний день

with rcte as
(
      select h.id
      ,h.parent_id
      ,h.name
      ,1 as HierarchyLevel 
  FROM RelTable h
  where id = 1
  union all
  select h2.id
       , h2.parent_id 
      , h2.name
      , r.HierarchyLevel + 1 AS HierarchyLevel 
  FROM RelTable h2
  inner join rcte r on h2.parent_id = r.id
 )
select id, parent_id, [1] as L1,[2] as L2,[3] as L3, [4] as L4
from (
select id,parent_id,name,HierarchyLevel from rcte
) as src
pivot  ( max(name)  for HierarchyLevel   in ([1],[2],[3],[4]) ) as pvt

что я делаю не так?

1 Ответ

2 голосов
/ 26 октября 2010

Слишком сложное решение? Если он зафиксирован на глубине 4, то это можно сделать с помощью простых соединений ...

SELECT
    L1.id as ID
    L1.Name as Level1
    L2.Name as Level2
    L3.Name as Level3
    L4.Name as Level4
FROM
    RelTable as L1

        INNER JOIN
    RelTable as L2
        ON L1.id = L2.ParentID

        INNER JOIN
    RelTable as L3
        ON L2.id = L3.ParentID

        INNER JOIN
    RelTable as L4
        ON L3.id = L4.ParentID

Как упражнение в использовании CTE бесполезно, но оно делает то, что вам нужно.

...