我正在尝试编写SQL来填充员工缺少的值。经理也是雇员。员工缺少的值可以从经理那里继承,如果员工的经理没有值,那么将查找经理的管理器(如果需要,必须查找根管理器,直到我们得到值为止)。
下面是表和数据
create table employee(
employee_id int primary key,
name text,
manager_id int,
department text,
lob text);
insert into employee
(employee_id,name,manager_id,department,lob)
values
(12,'a',null,'IT','BFI'),
(3,'b',12,'sales',null),
(4,'c',3,null,'Banking'),
(6,'d',12,null,null),
(7,'e',4,null,null),
(10,'f',7,null,null);

样本数据为这里
示例: employee_id=4有department = null和manager_id=3和lob=Banking,这里的部门对于这个雇员来说是空的,所以查询必须从雇员的经理继承department值。
雇员id=4的经理是3,有部门=销售部。现在,员工4的预期结果是

类似地,必须继承lob列的值来替换每个员工的空值。
示例:员工10和他的经理7都没有department和lob值,但是employee/manger 7有经理4,经理4有lob value Banking,department value sales继承他的经理。因此,员工10和员工7将继承department和lob的销售和银行价值。员工10的预期结果是

我的疑问
with RECURSIVE inherit_parent_values as (
select * from employee
where employee_id=10
union
select e.manager_id,p.name,p.manager_id,
coalesce(e.department,p.department),
coalesce(e.lob,p.lob)
from employee p inner join
inherit_parent_values e
ON e.manager_id=p.employee_id)
select * from inherit_parent_values尝试使用递归查询,但这将使所有管理人员行上升到每个员工的根级别,而不是每个员工的一行。
还必须在列级别获得null值。看来合并在我的查询中没有用
在PostgreSQL中可以从经理中填充employee空值吗?
预期结果是

发布于 2022-06-13 13:06:44
你做的是自下而上的(从叶开始--一个雇员),我会自上而下地(从根开始--一个高级经理):
WITH RECURSIVE rec AS (
SELECT *
FROM employee
WHERE manager_id IS NULL
UNION
SELECT
e.employee_id,
e.name,
e.manager_id,
COALESCE(e.department, r.department) as department,
COALESCE(e.lob, r.lob) as lob
FROM employee e
JOIN rec r ON r.employee_id = e.manager_id
)
SELECT * FROM rechttps://stackoverflow.com/questions/72603034
复制相似问题