如何在每个经理记录下显示经理ID,经理姓名和从属详细信息。
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ------ --------- ---- --------- ---- ---- ------
7839 KING PRESIDENT - 17-NOV-81 5000 - 10
7698 BLAKE MANAGER 7839 01-MAY-81 2850 - 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 - 10
7566 JONES MANAGER 7839 02-APR-81 2975 - 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
答案 0 :(得分:1)
试试这个:
WITH MyCTE AS
(
SELECT EMPNO, EName, Null as ManagerId, NULL as ManagerName
FROM Employee
WHERE ManagerID IS NULL
UNION ALL
SELECT EMPNO, EName, ManagerId, MyCTE.EName
FROM Employee
INNER JOIN MyCTE ON Employee.ManagerID = MyCTE.EmpID
WHERE Employee.ManagerID IS NOT NULL
)
SELECT *
FROM MyCTE
答案 1 :(得分:1)
只是添加一种没有CTE的方法,你需要加入你想要的每个级别:
select m.empno,
m.ename,
m.job,
e1.empno,
e1.ename underling,
e1.mgr,
e1.ujob,
e2.empno,
e2.ename subunderling,
e2.mgr,
e2.subjob
from
(
select empno, ename, job
from yourtable
where mgr is null
) m
left join
(
select empno, ename, job ujob, mgr
from yourtable
) e1
on m.empno = e1.mgr
left join
(
select empno, ename, job subjob, mgr
from yourtable
) e2
on e1.empno = e2.mgr
答案 2 :(得分:0)
这是一个难题,但它是可以解决的。首先,您必须记住没有ORDER BY的SQL查询不保证排序。因此,仅仅因为它恰好产生了正确的结果并不意味着查询对于你想要的是正确的。
面临的挑战是在记录中添加一个排序键,以便按顺序排列。这是记录的深度优先排序。其中一个挑战是拥有相同经理的三名员工需要不同的密钥 - 因为其他记录可能出现在他们之间。
因此,通过生成包含员工ID的顶部路径来构建有效的排序键。对于您的数据,密钥是:
按适当顺序排序。创建密钥是一项挑战,需要递归CTE。 (感谢安倍提供一个。)
WITH MyCTE AS
(
SELECT EMPNO, EName, Null as ManagerId, NULL as ManagerName,
cast(EMPNO as varchar(8000)) as sortkey
FROM Employee
WHERE ManagerID IS NULL
UNION ALL
SELECT EMPNO, EName, ManagerId, MyCTE.EName,
mycte.sortkey+'<--'+cast(Employee.empno as varchar(8000))
FROM Employee
INNER JOIN MyCTE ON Employee.ManagerID = MyCTE.EmpID
WHERE Employee.ManagerID IS NOT NULL
)
SELECT EMPNO, EName, ManagerId, MyCTE.EName
FROM MyCTE
order by sortkey
实际的排序键与上面的类似,但附加了'&lt; - '。请注意,这仅适用于排序键正好是4位数的情况。如果你有不同的长度,那么你会想要用零填充它们。