我有一个人和主管的简单表。我有超过200,000个条目 我需要为每个人派出三级主管。 我建议先使用connect,但我不习惯。有没有更简单的方法来推导? 它是oracle数据库,表中只有两列人员编号和管理员编号。预期的输出是,
PERSON LVL1_SUP LVL2_SUP LVL3_SUP
答案 0 :(得分:1)
怎么样:
create employee (
id int primary key not null,
name varchar2(20),
supervisor_id int
);
create index ix_employee_sup on employee (supervisor_id);
select e.*, s1.id, s2.id, s3.id
from employee e
left join employee s1 on e.supervisor_id = s1.id
left join employee s2 on s1.supervisor_id = s2.id
left join employee s3 on s2.supervisor_id = s3.id;
答案 1 :(得分:1)
解决问题"正确的方式" - 意思是,使用分层查询而不是多个连接 - 您不仅需要如您所说的CONNECT BY
查询(这将产生主管,但每个都将在不同的行上),而且还需要一个旋转操作。从Oracle 11.1开始,您可以使用PIVOT
运算符。
以下是使用标准EMP
架构中的标准SCOTT
表的示意图。在这里"员工"列是EMPNO
和"主管"列是MGR
。两列都是数字(员工编号),但如果你有他们的名字,查询将以相同的方式工作 - 只要名称是唯一的(通常他们不是,这就是我们使用唯一的原因) id就像EMPNO
)。
您会注意到大多数主管级别为NULL
- 这是因为该表总共只有14名员工。虽然有一名员工在他上面有三级监督员。当然,如果你看到一个没有任何级别的主管(即使是1级)的员工,那就是所有老板的老板(在这种情况下,公司的总裁和#34;)。
select *
from (
select e.empno, e.mgr, level as lvl
from scott.emp e
where level <= 3
connect by empno = prior mgr
)
pivot ( min(mgr) for lvl in (1 as lvl1_sup, 2 as lvl2_sup, 3 as lvl3_sup) )
;
EMPNO LVL1_SUP LVL2_SUP LVL3_SUP
---------- ---------- ---------- ----------
7839
7782 7839 7839
7844 7698
7698 7839 7839
7902 7566 7566
7521 7698
7566 7839 7839 7839
7654 7698
7788 7566 7566
7934 7782
7499 7698
7876 7788
7369 7902
7900 7698