代码之家  ›  专栏  ›  技术社区  ›  Scott Weinstein

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

  •  0
  • Scott Weinstein  · 技术社区  · 14 年前

    我有一个关系表(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 回复  |  直到 14 年前
        1
  •  2
  •   Stephen Turner    14 年前

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

    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
    

    作为使用CTES的练习,它是无用的,但它可以满足您的需要。