gpt4 book ai didi

sql-server - 有没有办法在 SQL Server 的分层查询中检测循环?

转载 作者:行者123 更新时间:2023-12-01 08:51:33 25 4
gpt4 key购买 nike

在 Oracle 中,我们可以使用函数 CONNECT_BY_ISCYCLE检测层次查询中的循环。我尝试在 SQL Server 中做同样的事情。有没有办法做到这一点?

非常感谢!

最佳答案

连接记录 ID/基于记录的 ROW_NUMBER 构建位图,并根据列表/位图验证每个新记录

create table t (id int,pid int)
insert into t values (1,3),(2,1),(3,2)

列表

识别周期
with cte (id,pid,list,is_cycle) 
as
(
select id,pid,',' + cast (id as varchar(max)) + ',',0
from t
where id = 1

union all

select t.id,t.pid,cte.list + cast (t.id as varchar(10)) + ',' ,case when cte.list like '%,' + cast (t.id as varchar(10)) + ',%' then 1 else 0 end
from cte join t on t.pid = cte.id
where cte.is_cycle = 0
)
select *
from cte
where is_cycle = 1
id  pid list        is_cycle
-- --- ---- --------
1 3 ,1,2,3,1, 1

用循环遍历完整图
with cte (id,pid,list) 
as
(
select id,pid,',' + cast (id as varchar(max)) + ','
from t
where id = 1

union all

select t.id,t.pid,cte.list + cast (t.id as varchar(10)) + ','
from cte join t on t.pid = cte.id
where cte.list not like '%,' + cast (t.id as varchar(10)) + ',%'
)
select *
from cte
id  pid list
1 3 ,1,
2 1 ,1,2,
3 2 ,1,2,3,

位图

ID 应该是一个以 1 开头的数字序列。
如有必要,请使用 ROW_NUMBER 生成它。

识别周期
with cte (id,pid,bitmap,is_cycle) 
as
(
select id,pid,cast (power(2,id-1) as varbinary(max)) ,0
from t
where id = 1

union all

select t.id,t.pid,cast (cte.bitmap|power(2,t.id-1) as varbinary(max)),case when cte.bitmap & power(2,t.id-1) > 0 then 1 else 0 end
from cte join t on t.pid = cte.id
where cte.is_cycle = 0
)
select *
from cte
where is_cycle = 1
id  pid bitmap      is_cycle
1 3 0x00000007 1

用循环遍历完整图
with cte (id,pid,bitmap) 
as
(
select id,pid,cast (power(2,id-1) as varbinary(max))
from t
where id = 1

union all

select t.id,t.pid,cast (cte.bitmap|power(2,t.id-1) as varbinary(max))
from cte join t on t.pid = cte.id
where cte.bitmap & power(2,t.id-1) = 0
)
select *
from cte
id  pid bitmap
1 3 0x00000001
2 1 0x00000003
3 2 0x00000007

关于sql-server - 有没有办法在 SQL Server 的分层查询中检测循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40574229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com