CTE SQL查询得到完整路径
-
18-09-2019 - |
题
我有简单的查询
WITH conn_cte ( ParentCategoryId, CategoryId, IdsPath )
AS ( SELECT ParentCategoryId
,CategoryId
,CAST(ParentCategoryId AS varchar(1000))
FROM Ind_CategoriesConnections
WHERE ParentCategoryId = 0
UNION ALL
SELECT cc.ParentCategoryId
,cc.CategoryId
,CAST(IdsPath + ','
+ CAST (cc.ParentCategoryId AS varchar(5)) AS varchar(1000))
FROM Ind_CategoriesConnections AS cc
INNER JOIN conn_cte AS conn ON conn.CategoryId = cc.ParentCategoryId
AND cc.categoryid NOT IN (
SELECT conn.Categoryid )
)
SELECT x.*
FROM ( SELECT t.ParentCategoryId
,t.CategoryId
,t.IdsPath + ',' + CAST(t.CategoryId AS varchar(5)) AS [path]
FROM conn_cte t
INNER JOIN Ind_Categories c ON t.CategoryId = c.CategoryId
AND c.CategoryViewId = 1
AND c.IsActiveYN = 1
) x
ORDER BY x.path
我在查询(最优的),只有从根返回完整路径叶有趣。
例如结果的部分是
Parent Child Path
12 16 0,8,12,16
16 17 0,8,12,16,17
17 18 0,8,12,16,17,18
17 19 0,8,12,16,17,19
零为根18,19叶子(和孩子),我想忽略像0,8,12,16
和0,8,12,16,17
部分路径,并获得唯一的全路径(与叶端)
0,8,12,16,17,18
和0,8,12,16,17,19
解决方案
您可以这样说:
WHERE NOT EXISTS (SELECT * FROM conn_cte AS parents WHERE t.path LIKE parents.path + '%')
其他提示
DECLARE @tbl TABLE
(
Id int
,ParentId int
)
INSERT INTO @tbl
( Id, ParentId )
VALUES ( 0, NULL )
, ( 8, 0 )
, ( 12, 8 )
, ( 16, 12 )
, ( 17, 16 )
, ( 18, 17 )
, ( 19, 17 )
;
WITH abcd
AS (
-- anchor
SELECT id
,ParentID
,CAST(id AS VARCHAR(100)) AS [Path]
FROM @tbl
WHERE ParentId IS NULL
UNION ALL
--recursive member
SELECT t.id
,t.ParentID
,CAST(a.[Path] + ',' + CAST( t.ID AS VARCHAR(100)) AS varchar(100)) AS [Path]
FROM @tbl AS t
JOIN abcd AS a ON t.ParentId = a.id
)
SELECT Id ,ParentID ,[Path]
FROM abcd
WHERE Id NOT IN ( SELECT ParentId
FROM @tbl
WHERE ParentId IS NOT NULL )
返回
Id ParentID Path
----------- ----------- ----------------------
18 17 0,8,12,16,17,18
19 17 0,8,12,16,17,19
搜索结果
语法是SQL Server 2008中,2005年的变化INSERT INTO @tbl ...
语法。
不隶属于 StackOverflow