题
我的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
解决方案
我认为这应该为您找到问题记录。它添加了一个 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)
其他提示
这是您可以用来查找周期的一些东西。
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
结果:
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
我要做的第一件事就是改变以下方式:
JOIN ClassTree
ON Parent_ID = ClassTree.ID
为此:
JOIN ClassTree
ON t.Parent_ID = ClassTree.ID
它可能正在尝试加入ClassTree,因为您没有在JOIN中指定表格别名。
不隶属于 dba.stackexchange