将父/子表转换为固定的列维表

时间:2010-10-26 15:45:52

标签: sql-server pivot olap recursive-query

我有一个关系表(id,parentId,name)

我想转换成扁平的维度表

(id,Level1,Level2,Level3,Level4)

我可以将深度固定在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 个答案:

答案 0 :(得分:2)

解决方案过于复杂?如果它固定在四深,则可以通过一些简单的连接来完成......

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的练习,它无用,但它可以满足你的需要。