34,593
社区成员
发帖
与我相关
我的任务
分享
JOIN CTE T2 ON T2.[PATH]+'-' LIKE T1.[PATH]+'-%'
==>
JOIN CTE T2 ON charindex(T1.[PATH],T2.[PATH])=1
效率是否高一些DECLARE @ID INT
SET @ID=1
;WITH CTE AS(
SELECT id,pid
,id RootID
,CAST(''AS VARCHAR(10)) id2
,1 DEEP
FROM tab
WHERE pid=@ID
UNION ALL
SELECT T1.id,T1.pid
,T2.RootID
,CAST(T1.id AS VARCHAR(10))
,T2.DEEP+1
FROM tab T1
JOIN CTE T2 ON T1.pid=T2.id
)
SELECT RootID ID
,COUNT(1)[间接用户数量]
,STUFF((SELECT ','+id2 FROM CTE T2
WHERE T1.RootID=T2.RootID
AND T2.DEEP>1
FOR XML PATH(''))
,1,1,'')[包含的用户]
FROM CTE T1
WHERE DEEP>1
GROUP BY ALL RootID
DECLARE @ID INT
SET @ID=1
;WITH CTE AS(
SELECT id,pid
,CAST(id AS VARCHAR(MAX))[PATH]
,1 DEEP
FROM tab
WHERE pid=@ID
UNION ALL
SELECT T1.id,T1.pid
,T2.[PATH]+'-'+CAST(T1.id AS VARCHAR(10))
,T2.DEEP+1
FROM tab T1
JOIN CTE T2 ON T1.pid=T2.id
)
,CTE2 AS(
SELECT T1.id,T2.id id2,T1.[PATH]
FROM CTE T1
JOIN CTE T2 ON T2.[PATH]+'-' LIKE T1.[PATH]+'-%'
AND T2.DEEP>=T1.DEEP+2
WHERE T1.DEEP%2=1
)
SELECT id
,COUNT(1)[间接用户数量]
,STUFF((SELECT ','+CAST(id2 AS VARCHAR(10)) FROM CTE2 T2
WHERE T2.id=T1.id
FOR XML PATH(''))
,1,1,'')[包含的用户]
FROM CTE2 T1
GROUP BY id,[PATH]
ORDER BY [PATH]