1

如何在每个经理记录下显示经理 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 
4

3 回答 3

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
于 2012-09-14T17:45:08.870 回答
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

SQL Fiddle with Demo

于 2012-09-14T18:01:28.607 回答
0

这是一个难题,但它是可以解决的。首先,您必须记住,没有 ORDER BY 的 SQL 查询不能保证排序。因此,仅仅因为它恰好产生了正确的结果并不意味着查询对于您想要的内容是正确的。

挑战是在记录上添加一个排序键,以正确的顺序排列事物。这是记录的深度优先排序。挑战之一是同一经理的三名员工需要不同的密钥——因为他们之间可能会出现其他记录。

因此,有效的排序键是通过生成包含员工 ID 的顶部路径来构建的。对于您的数据,键是:

  • '7839'
  • '7839<--7698'
  • '7839<--7782'
  • '7839<--7566'
  • '7839<--7698<--7654'

这些按适当的顺序排序。创建密钥是一项挑战,需要递归 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

实际的排序键与上面的类似,但附加了“<--”。请注意,这仅在排序键正好是 4 位时才有效。如果您有不同的长度,那么您将希望用零填充它们。

于 2012-09-14T17:59:25.673 回答