我有一个带有树结构的表:
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查询?谢谢!
答案 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;
请注意,对于给定的父版本,您从未提供用于确定次要版本号的固定逻辑。也就是说,尚不清楚为什么Medical
在层次结构中早于Jobs
出现。
答案 1 :(得分:0)
您可以使用row_number()
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表。并且您需要更新订单,以便我们对所需的输出进行更简单的查询。
谢谢