TSQL CTE递归查询

时间:2019-08-23 16:16:47

标签: tsql

我正在尝试确定是否可以为正在创建的简单应用程序在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  

0 个答案:

没有答案