sql-server - 在 SQL Server 中显示排序的层次结构行?

标签 sql-server tsql sql-server-2008-r2 sql-order-by

假设我有这个表:(c是父级p的子级)

c   p
------
40  0
2   3
2   40
3   1
7   2
1   0

其中(0 表示 root)- 我希望选择的顺序显示为:

c   b
------
1   0
3   1
2   3
40  0
2   40
7   2

那是因为我们有 2 个根 (1,40) 和 1 < 40。

因此,我们从 1 开始,然后在其下方显示 - 它的所有后代。

然后我们到达40。同样的逻辑。

enter image description here

问题:

我该怎么做?

我已经成功地以递归方式显示它+查找层次结构级别*(不确定它是否有帮助)*

WITH cte(c, p) AS (
     SELECT 40, 0 UNION ALL
     SELECT 2,3 UNION ALL
     SELECT 2,40 UNION ALL
     SELECT 3,1 UNION ALL
     SELECT 7,2 UNION ALL   
     SELECT 1,0
     ) , cte2 AS(
         SELECT c,
                p,
                PLevel = 1
         FROM   cte
         WHERE  p = 0
         UNION ALL
         SELECT cte.c,
                cte.p,
                PLevel = cte2.PLevel + 1
         FROM   cte
                INNER JOIN cte2
                     ON  cte2.c = cte.p
     )

SELECT *
FROM   cte2

Full SQL fiddle

最佳答案

你已经快完成了。只需添加一个排名来标识每个组,然后对其数据进行排序。

此外,当您处理更复杂的层次结构时,我们需要更改 [level] 值。 In 现在不是数字,将当前元素到其父元素的完整路径。其中 \ 表示父级。例如以下字符串:

\1\5\4\1

代表以下层次结构:

   1
   --> 5
       --> 4
           --> 1

我从 hierarchyid 得到这个想法类型。您可能需要考虑使用它来存储层次结构,因为它具有方便的内置函数来处理此类结构。

<小时/>

这是使用新数据的完整工作示例:

DECLARE @DataSource TABLE
(
    [c] TINYINT
   ,[p] TINYINT
);

INSERT INTO @DataSource ([c], [p])
VALUES (1,0)
      ,(3, 1)
      ,(2, 3)
      ,(5,1)
      ,(7, 2)
      ,(40, 0)
      ,(2, 40);

WITH DataSource ([c], [p], [level], [rank])AS
(
    SELECT [c]
          ,[p]
          ,CAST('/' AS VARCHAR(24))
          ,ROW_NUMBER() OVER (ORDER BY [c] ASC)
    FROM  @DataSource
    WHERE [p] = 0
    UNION ALL
    SELECT DS.[c]
          ,DS.[p]
          ,CAST(DS1.[level] + CAST(DS.[c] AS VARCHAR(3)) + '/' AS VARCHAR(24))
          ,DS1.[rank]
    FROM  @DataSource DS
    INNER JOIN DataSource DS1
        ON  DS1.[c] = DS.[p]
)
SELECT [c]
      ,[p]
FROM DataSource
ORDER BY [Rank]
        ,CAST([level] AS hierarchyid);

enter image description here

再次注意参与两个组的节点(7,2)(即使在您的示例中也是如此)。我想这只是一个示例数据,您有办法定义应该包含节点的位置。

关于sql-server - 在 SQL Server 中显示排序的层次结构行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31829502/

相关文章:

mysql - T-SQL (transact-SQL) 在 SQLite 和其他 SQL 数据库中有效吗?

sql-server - 在 SQL 中使用 INFORMATION_SCHEMA.TABLE_CONSTRAINTS 查找约束列名称

sql - 如何让 SQLCMD 仅输出错误和警告

sql - 使用 MS SQL Server 根据项目顺序和父类别顺序对项目进行排序

sql - 根据加入日期和离开日期选择用户

sql - 是否可以在 Count() 中指定条件?

sql-server - 内联表值 UDF 性能

c# - 外部更新数据库时刷新网络表单

SQL Server - 从序列中获取下一个值而不推进 current_value

sql-server - 查找具有两个指定列名的 SQL Server 表