首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server员工管理器层次结构删除循环引用

Server员工管理器层次结构删除循环引用
EN

Stack Overflow用户
提问于 2021-07-22 16:51:06
回答 1查看 195关注 0票数 0

我有一个员工名单;每个员工都被分配给一个经理。经理会在任何时候为员工更换。我使用递归CTE来获取经理的员工。

我收到了这个错误

在语句完成之前,最大递归100已经耗尽。

当层次结构是这样的时候:

代码语言:javascript
复制
x  => y
y  => z
z  => x
x  => y

在获得经理层次结构员工时,我希望跳过员工x => y的循环引用。

EN

回答 1

Stack Overflow用户

发布于 2021-07-23 13:34:09

您的示例数据有点模糊(可能过于简化)。不过,您可以使用递归的CTE遍历图并检测循环。

例如,可以将示例数据创建为:

代码语言:javascript
复制
create table t (
  k int,
  emp_id char(1),
  manager_id char(1)
);

insert into t (k, emp_id, manager_id) values
  (1, 'x', 'y'),
  (2, 'y', 'z'),
  (3, 'z', 'x'),
  (4, 'x', 'y');

然后,从第一行开始遍历并检测循环的查询可以采用表单(参见在db<>fiddle上运行的示例):

代码语言:javascript
复制
with
n as (
  select k, emp_id, manager_id, 0 as level,
    cast(concat(':', emp_id, ':') as varchar(1000)) as path, 0 as cycle_found
  from t where k = 1
 union all
  select t.k, t.emp_id, t.manager_id, n.level + 1,
    cast(concat(path, t.emp_id, ':') as varchar(1000)),
    sign(charindex(concat(':', t.emp_id, ':'), path))
  from n
  join t on t.emp_id = n.manager_id
    and n.cycle_found = 0
)
select * from n;

结果:

代码语言:javascript
复制
k  emp_id  manager_id  level  path       cycle_found 
-- ------- ----------- ------ ---------- ----------- 
1  x       y           0      :x:        0           
2  y       z           1      :x:y:      0           
3  z       x           2      :x:y:z:    0           
1  x       y           3      :x:y:z:x:  1           
4  x       y           3      :x:y:z:x:  1           

注意,通过在列path中存储所有已遍历的节点来检测循环。还请注意,一旦检测到循环,查询将通过使用条件and n.cycle_found = 0立即停止遍历该路径。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68488754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档