如何显示经理ID,命名从属ID&经理记录后的名字

时间:2012-09-14 17:39:02

标签: sql sql-server tsql

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

3 个答案:

答案 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

请参阅SQL Fiddle with Demo

答案 2 :(得分: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

实际的排序键与上面的类似,但附加了'&lt; - '。请注意,这仅适用于排序键正好是4位数的情况。如果你有不同的长度,那么你会想要用零填充它们。