我正在尝试确定是否可以为正在创建的简单应用程序在Microsoft SQL Server中的某些数据上创建树路径。我有一个包含[站点]列和[请求ID]列的表。 [RequestID]列是唯一值,网站不是(每个网站有多个请求)。例如,数据如下所示:
Site RequestID
1 1234
1 1839
1 1934
2 2930
2 1029
3 2112
我想做的是创建一个查询,该查询将为我提供到站点的每个RequestID的树路径,例如,使用上述数据:
Site RequestID Treepath
1 1234 1 -> 1234
1 1839 1 -> 1839
1 1934 1 -> 1934
2 2930 2 -> 2930
2 1029 2 -> 1029
3 2112 3 -> 2112
这将允许我的应用程序在treecontrol中列出Treepath,以便每个站点都可以看到所有请求。
这是一个基于我所看到的示例的尝试示例:
With CTE(site, RequstID, Parent, Level, Treepath) AS
(
SELECT
site
,RequestID
,Parent = TRIM(REPLACE(site, '.', ''))
,0 AS Level
,CAST(site AS VARCHAR(1024)) AS Treepath
FROM [dbo].[vwPendingRequests]
UNION ALL
SELECT
d.site
,d.RequestID
,Parent = TRIM(REPLACE(d.site, '.', ''))
,CTE.Level + 1 AS Level
,CAST(CTE.treepath + '->' + CAST(d.RequestID AS VARCHAR(1024)) AS VARCHAR(1024)) AS treepath
FROM [dbo].[vwPendingRequests] d
INNER JOIN CTE ON CTE.Parent = d.site
)
SELECT * FROM CTE
每个网站的请求ID重复两次的结果片段(在以9924结尾的请求ID的摘要中列出了两次):
Site RequestID Parent Level Treepath
1226. 0816201915385157492 1226. 0 1226.
1378. 0819201914290965454 1378. 0 1378.
1378. 0819201914301050727 1378. 0 1378.
1170. 0812201910311259924 1170. 1 1170. -> 0812201910311259924
1170. 0816201914394436145 1170. 1 1170. -> 0816201914394436145
1170. 081620191529504974 1170. 1 1170. -> 081620191529504974
1170. 0816201916175658845 1170. 1 1170. -> 0816201916175658845
1170. 0816201916214766144 1170. 1 1170. -> 0816201916214766144
1170. 0816201916245247679 1170. 1 1170. -> 0816201916245247679
1170. 0812201910311259924 1170. 1 1170. -> 0812201910311259924
好吧,如果我像这样调整它,它似乎可以工作,只是不确定这是否是编写此代码的最有效方法。我最初有12个请求,所以我希望有24个结果:
With CTE(site, RequstID, Parent, Level, Treepath) AS
(
SELECT
site
,RequestID
,Parent = TRIM(REPLACE(site, '.', ''))
,0 AS Level
,CAST(site AS VARCHAR(1024)) AS Treepath
FROM [dbo].[vwPendingRequests]
UNION ALL
SELECT
d.site
,d.RequestID
,Parent = TRIM(REPLACE(d.site, '.', ''))
,CTE.Level + 1 AS Level
,CAST(CTE.treepath + '->' + CAST(d.RequestID AS VARCHAR(1024)) AS VARCHAR(1024)) AS treepath
FROM [dbo].[vwPendingRequests] d
INNER JOIN CTE ON CTE.Parent = d.site
)
SELECT * FROM CTE order by Level, Parent
结果:
Site RequestID Parent Level Treepath
1170. 0812201910311259924 1170. 0 1170.
1170. 0816201914394436145 1170. 0 1170.
1170. 081620191529504974 1170. 0 1170.
1170. 0816201916175658845 1170. 0 1170.
1170. 0816201916214766144 1170. 0 1170.
1170. 0816201916245247679 1170. 0 1170.
1183. 081620191614426065 1183. 0 1183.
1185. 0816201916093524374 1185. 0 1185.
1202. 0816201915425031255 1202. 0 1202.
1226. 0816201915385157492 1226. 0 1226.
1378. 0819201914290965454 1378. 0 1378.
1378. 0819201914301050727 1378. 0 1378.
1170. 081620191529504974 1170. 1 1170. -> 081620191529504974
1170. 0816201914394436145 1170. 1 1170. -> 0816201914394436145
1170. 0812201910311259924 1170. 1 1170. -> 0812201910311259924
1170. 0816201916245247679 1170. 1 1170. -> 0816201916245247679
1170. 0816201916214766144 1170. 1 1170. -> 0816201916214766144
1170. 0816201916175658845 1170. 1 1170. -> 0816201916175658845
1183. 081620191614426065 1183. 1 1183. -> 081620191614426065
1185. 0816201916093524374 1185. 1 1185. -> 0816201916093524374
1202. 0816201915425031255 1202. 1 1202. -> 0816201915425031255
1226. 0816201915385157492 1226. 1 1226. -> 0816201915385157492
1378. 0819201914301050727 1378. 1 1378. -> 0819201914301050727
1378. 0819201914290965454 1378. 1 1378. -> 0819201914290965454