【发布时间】:2021-06-28 11:43:28
【问题描述】:
我有一个员工、经理层级,最终可能是循环的。
例如: 28397468N>88518119N>87606705N>28397468N
Create Table emp_manager ( Emp_id varchar(30), Manager_id varchar(30));
Insert into emp_manager values ('28397468N','88518119N');
Insert into emp_manager values ('88518119N','87606705N');
Insert into emp_manager values ('87606705N','28397468N');
我的要求是: 当我的 proc 被调用并且 emp_manager 表中有循环层次结构时,我们应该返回一个错误,列出层次结构中的员工。
以下链接包含一些有用的信息: https://mccalljt.io/blog/2017/01/postgres-circular-references/
我已经修改如下:
select * from (
WITH RECURSIVE circular_managers(Emp_id, Manager_id, depth, path, cycle) AS (
SELECT u.Emp_id, u.Manager_id, 1,
ARRAY[u.Emp_id],
false
FROM emp_manager u
UNION ALL
SELECT u.Emp_id, u.Manager_id, cm.depth + 1,
(path || u.Emp_id)::character varying(32)[],
u.Emp_id = ANY(path)
FROM emp_manager u, circular_managers cm
WHERE u.Emp_id = cm.Manager_id AND NOT cycle
)
select
distinct (path) d
FROM circular_managers
WHERE cycle
AND path[1] = path[array_upper(path, 1)]) cm
但是,问题是,它返回了层次结构的所有组合:
{28397468N,88518119N,87606705N,28397468N}
{87606705N,28397468N,88518119N,87606705N}
{88518119N,87606705N,28397468N,88518119N}
I need a simple answer like this:
28397468N>88518119N>87606705N>28397468N
even this will do:
28397468N>88518119N>87606705N
请帮忙!
【问题讨论】:
-
我不明白 id='28397468N' 从哪里出现在结果中。我没有看到具有这种价值的
INSERT。你错过了吗? -
我现在修改了问题以与数据保持一致。请检查。
-
“SORT 不起作用,因为我的员工 ID 是 VARCHAR 而不是 INT”是什么意思?当然你可以
ORDER BYvarchar 列,就像整数列一样。 -
"我的要求是:当我的 proc 被调用并且有循环层次结构时" - 你在说什么程序?它是否应该通过在插入/更新时引发异常来防止发生此类循环引用的触发器?它是一个应该只列出圆圈的存储视图吗?
-
它是存储过程的一部分,如果有循环引用,它应该列出每个唯一的圆。我在问题中添加了我的 SQL。
标签: postgresql circular-reference