【问题标题】:Sql query for tree table树表的sql查询
【发布时间】:2011-04-02 09:55:31
【问题描述】:

我有一个树形结构的表:

id parentId name
----------------
1  0        Category1
2  0        Category2
3  1        Category3
4  2        Category4
5  1        Category5
6  2        Category6
7  3        Category7

在 sql 查询结果中,我需要一个类似的表:

id parentId level name
----------------------
1  0        0     Category1
3  1        1     Category3
7  3        2     Category7
5  1        1     Category5
2  0        0     Category2
4  2        1     Category4
6  2        1     Category6

谁能帮我写ms-sql查询? 谢谢!

【问题讨论】:

    标签: sql sql-server sql-server-2008 hierarchical-data


    【解决方案1】:

    扩展 a_horse_with_no_name 的答案,这显示了如何结合使用 SQL Server 的 implementation of recursive CTE递归单记录交叉应用)与 row_number() 产生问题中的准确输出。 p>

    declare @t table(id int,parentId int,name varchar(20))
    insert @t select 1,  0        ,'Category1'
    insert @t select 2,  0,        'Category2'
    insert @t select 3,  1,        'Category3'
    insert @t select 4 , 2,        'Category4'
    insert @t select 5 , 1,        'Category5'
    insert @t select 6 , 2,        'Category6'
    insert @t select 7 , 3,        'Category7'
    ;
    
    WITH tree (id, parentid, level, name, rn) as 
    (
       SELECT id, parentid, 0 as level, name,
           convert(varchar(max),right(row_number() over (order by id),10)) rn
       FROM @t
       WHERE parentid = 0
    
       UNION ALL
    
       SELECT c2.id, c2.parentid, tree.level + 1, c2.name,
           rn + '/' + convert(varchar(max),right(row_number() over (order by tree.id),10))
       FROM @t c2 
         INNER JOIN tree ON tree.id = c2.parentid
    )
    SELECT *
    FROM tree
    ORDER BY cast('/' + RN + '/' as hierarchyid)
    

    说实话,使用 ID 本身来生成树“路径”是可行的,因为我们直接按 id 排序,但我想我会在 row_number() 函数中滑倒。

    【讨论】:

      【解决方案2】:
      WITH tree (id, parentid, level, name) as 
      (
         SELECT id, parentid, 0 as level, name
         FROM your_table
         WHERE parentid = 0
      
         UNION ALL
      
         SELECT c2.id, c2.parentid, tree.level + 1, c2.name
         FROM your_table c2 
           INNER JOIN tree ON tree.id = c2.parentid
      )
      SELECT *
      FROM tree;
      

      我目前手头没有 SQL Server 来测试它,所以那里可能有一些拼写错误(语法错误)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多