SQL查询树表菜单

时间:2018-12-05 04:55:46

标签: sql sql-server

我有一个带有树结构的表:

ID    Title           ParentID     Orderby 
----------------------------------------
1     All             0            2
2     Banking         1            5
3     USAA Checking   0            0
4     USAA Mastercard 1            9
5     Medical         3            0
6     Jobs            3            100
7     Archive         0            1
8     Active          7            0  
9     BoA Amex        1            1

我需要编写一个SQL查询以产生这样的结果(按Orderby列进行ORDER):

ID    Title           Path         Orderby 
----------------------------------------
3     USAA Checking   1            0
5     Medical         1.1          0
6     Jobs            3.2          100
7     Archive         2            1
8     Active          2.1          0
1     All             3            2
9     BoA Amex        3.1          1
2     Banking         3.2          5
4     USAA Mastercard 3.3          9

谁可以帮助我编写SQL查询?谢谢!

3 个答案:

答案 0 :(得分:1)

我们可以使用递归CTE来做到这一点:

WITH children AS (
    SELECT NULL AS ParentID, ID, Title, Orderby,
        CAST(ID AS VARCHAR(500)) AS Path
    FROM Categories
    WHERE ParentID = 0

    UNION ALL

    SELECT 
       d.ParentID, t.counter + 1, d.ID, d.Title, d.Orderby,
       CAST(CAST(t.Path AS VARCHAR(50)) + '.' +
       CAST(ROW_NUMBER() OVER (PARTITION BY d.ParentID ORDER BY d.ID) AS VARCHAR(50)) AS VARCHAR(500))
    FROM children t
    INNER JOIN Categories AS d
        ON d.ParentID = t.ID
)

SELECT ID, Title, Path, Orderby
FROM children;

enter image description here

Demo

请注意,对于给定的父版本,您从未提供用于确定次要版本号的固定逻辑。也就是说,尚不清楚为什么Medical在层次结构中早于Jobs出现。

答案 1 :(得分:0)

您可以使用row_number()

在下面尝试

DEMO

select Id,title, concat(val,'.',case when 
row_number() over(partition by val order by Id)-1=0 then null else 
row_number() over(partition by val order by Id)-1 end) as path,
orderby
from
(
select *,case when parentid=0 then id else parentid end as val
from Categories
)A

答案 2 :(得分:0)

如果您具有层次结构的一级,则可以尝试以下查询

 Select  
      C.ID as ID, 
      C.Title  as Title, 
      Case 
        when C.ParentID =0 then cast(C.ID as  varchar(2)) 
        else cast(C.ParentID as varchar(2)) + '.' + cast(C.Order as varchar(3)) 
      END as Path, 
      C.Order 
  from Categories as C

如果您具有多级层次结构,则需要创建Temp表。并且您需要更新订单,以便我们对所需的输出进行更简单的查询。

谢谢