树表菜单的SQL查询
我有一个树状结构的表:树表菜单的SQL查询,sql,sql-server,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
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查询来生成如下结果(按列排序):
谁能帮我写一个SQL查询?谢谢 您可以使用
row\u 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
如果您有一个层次结构级别,可以尝试下面的查询
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
如果有多级层次结构,则需要创建临时表。您需要更新订单,以便我们对所需的输出进行更简单的查询
谢谢我们可以使用递归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
。您应该解释您的逻辑考虑使用其他方法,您需要一个递归CTEE解释您如何计算USAA万事达卡的路径
否,我不理解您的评论。请再次检查,我只是调整了一下问题,让它更容易理解,对不起,因为我的英语不太好
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;