我的 CTE 为特定客户无限循环运行,我无法找出原因。
这是查询:
;WITH ClassTree
AS (SELECT ID, NAME, Parent_ID
FROM TableName
WHERE ID = 1
UNION ALL
SELECT T.ID, T.NAME, T.Parent_ID
FROM TableName T WITH (NOLOCK)
JOIN ClassTree
ON Parent_ID = ClassTree.ID
)
SELECT * FROM ClassTree
Run Code Online (Sandbox Code Playgroud)
这里有一些东西,你可以用它来找到你的周期。
declare @T table
(
ID int,
Parent_ID int
)
insert into @T values
(1, 3),(2, 1),(3, 2), -- This is a cycle
(4, 4), -- This is a cycle
(5, null),(6, 5),(7, 6) -- This is not a cycle
;with C as
(
select T.ID,
T.Parent_ID,
cast(',' + cast(ID as varchar(10)) + ',' as varchar(max)) as Path,
0 Cycle
from @T as T
union all
select T.ID,
T.Parent_ID,
C.Path + cast(T.ID as varchar(10)) + ',',
case when C.Path like '%,'+cast(T.ID as varchar(10))+',%'
then 1
else 0
end
from @T as T
inner join C
on T.Parent_ID = C.ID
where C.Cycle = 0
)
select *
from C
where Cycle = 1
Run Code Online (Sandbox Code Playgroud)
结果:
ID Parent_ID Path Cycle
----------- ----------- ---------- -----------
4 4 ,4,4, 1
3 2 ,3,1,2,3, 1
2 1 ,2,3,1,2, 1
1 3 ,1,2,3,1, 1
Run Code Online (Sandbox Code Playgroud)
我想这应该可以帮你找到问题记录。它将添加LEVEL
到您的层次结构,然后查找存在于多个级别的单个 ID 记录。
;WITH ClassTree
AS (SELECT ID, NAME, Parent_ID, 1 as 'Level'
FROM TableName
WHERE ID = 1
UNION ALL
SELECT T.ID, T.NAME, T.Parent_ID, Level + 1 as 'Level'
FROM TableName T WITH (NOLOCK)
JOIN ClassTree
ON Parent_ID = ClassTree.ID
)
SELECT *
FROM ClassTree c1
WHERE EXISTS (SELECT 1 FROM ClassTree c2
WHERE c2.id = c1.id
AND c2.Level > c1.level)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8443 次 |
最近记录: |