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

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 FiddlewithDemoを参照してください

于 2012-09-14T18:01:28.607 に答える
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 に答える
0

これは難しい問題ですが、解決可能です。まず、ORDER BY のない SQL クエリは順序付けを保証しないことを覚えておく必要があります。したがって、たまたま正しい結果が生成されたからといって、そのクエリが目的に対して正しいとは限りません。

課題は、レコードにソートキーを追加して、物事を正しい順序に並べることです。これは、レコードの深さ優先の順序付けです。課題の 1 つは、同じマネージャーを持つ 3 人の従業員が異なるキーを必要とすることです。これは、従業員の間に別のレコードが表示される可能性があるためです。

したがって、機能するソートキーは、従業員 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

実際のソートキーは上記のものと似ていますが、'<--' が追加されています。1 つの注意点として、これはソート キーが正確に 4 桁の場合にのみ機能します。さまざまな長さがある場合は、左にゼロを埋め込む必要があります。

于 2012-09-14T17:59:25.673 に答える