web-dev-qa-db-ja.com

従業員をマネージャーと結び付ける方法

これは、出力を次のようにしたいものです。

Employee   Emp# Manager Mgr# 
   BLAKE   7698 KING    7839 
   CLARK   7782 KING    7839 
   JONES   7566 KING    7839 
   MARTIN  7654 BLAKE   7698 
   ALLEN   7499 BLAKE   7698 
   TURNER  7844 BLAKE   7698 
   JAMES   7900 BLAKE   7698 
   WARD    7521 BLAKE   7698 
   FORD    7902 JONES   7566 
   SMITH   7369 FORD    7902 
   SCOTT   7788 JONES   7566 
   ADAMS   7876 SCOTT   7788 
   MILLER  7934 CLARK   7782 

ここに私が得たものがあります:

 SQL> SELECT ename, empno, (SELECT ename FROM EMP WHERE empno = mgr)AS MANAGER, mgr from emp order by empno;

 ENAME           EMPNO MANAGER           MGR
 ---------- ---------- ---------- ----------
 SMITH            7369                  7902
 ALLEN            7499                  7698
 WARD             7521                  7698
 JONES            7566                  7839
 MARTIN           7654                  7698
 BLAKE            7698                  7839
 CLARK            7782                  7839
 SCOTT            7788                  7566
 KING             7839
 TURNER           7844                  7698
 ADAMS            7876                  7788

 ENAME           EMPNO MANAGER           MGR
 ---------- ---------- ---------- ----------
 JAMES            7900                  7698
 FORD             7902                  7566
 MILLER           7934                  7782

マネージャーフィールドが空白である理由がわかりません。

表は次のとおりです。

 SQL> select empno, ename, job,deptno, mgr from emp;

 EMPNO ENAME      JOB           DEPTNO        MGR
 ---------- ---------- --------- ---------- ----------
  7839 KING       PRESIDENT         10
  7698 BLAKE      MANAGER           30       7839
  7782 CLARK      MANAGER           10       7839
  7566 JONES      MANAGER           20       7839
  7654 MARTIN     SALESMAN          30       7698
  7499 ALLEN      SALESMAN          30       7698
  7844 TURNER     SALESMAN          30       7698
  7900 JAMES      CLERK             30       7698
  7521 WARD       SALESMAN          30       7698
  7902 FORD       ANALYST           20       7566
  7369 SMITH      CLERK             20       7902

 EMPNO ENAME      JOB           DEPTNO        MGR
 ---------- ---------- --------- ---------- ----------
  7788 SCOTT      ANALYST           20       7566
  7876 ADAMS      CLERK             20       7788
  7934 MILLER     CLERK             10       7782

14行が選択されました。

10
user770022

これは古典的な自己結合です。次を試してください。

SELECT e.ename, e.empno, m.ename as manager, e.mgr
FROM
    emp e, emp m
WHERE e.mgr = m.empno

また、マネージャーのいない社長を含める場合は、内部結合の代わりに外部結合をOracle構文で使用します。

SELECT e.ename, e.empno, m.ename as manager, e.mgr
FROM
    emp e, emp m
WHERE e.mgr = m.empno(+)

または、ANSI SQL構文で:

SELECT e.ename, e.empno, m.ename as manager, e.mgr
FROM
    emp e
    LEFT OUTER JOIN emp m
        ON e.mgr = m.empno
31
Xint0
(SELECT ename FROM EMP WHERE empno = mgr)

この基準を満たすレコードはEMPにありません。

この関係を取得するには、自己結合する必要があります。

SELECT e.ename AS Employee, e.empno, m.ename AS Manager, m.empno
FROM EMP AS e LEFT OUTER JOIN EMP AS m
ON e.mgr =m.empno;

編集:

inner joinであるため、選択した回答には社長は表示されません。アウトプットが宿題の割り当てに必要なものではないことに気付いたら、戻ってくると思います。実際のテストケースは次のとおりです。

> select * from emp;

 empno | ename |    job    | deptno | mgr  
-------+-------+-----------+--------+------
  7839 | king  | president |     10 |     
  7698 | blake | manager   |     30 | 7839
(2 rows)

> SELECT e.ename employee, e.empno, m.ename manager, m.empno
FROM emp AS e LEFT OUTER JOIN emp AS m
ON e.mgr =m.empno;

 employee | empno | manager | empno 
----------+-------+---------+-------
 king     |  7839 |         |      
 blake    |  7698 | king    |  7839
(2 rows)

違いは、外部結合がすべての行を返すことです。内部結合は次を生成します。

> SELECT e.ename, e.empno, m.ename as manager, e.mgr
FROM emp e, emp m
WHERE e.mgr = m.empno;

 ename | empno | manager | mgr  
-------+-------+---------+------
 blake |  7698 | king    | 7839
(1 row)
5
Brian Roach

これを試して

SELECT E.ename,E.empno,ISNULL(E.ename,'NO MANAGER') AS MANAGER FROM emp e
INNER JOIN emp M
ON  M.empno=E.empno

サブクエリの代わりに自己結合を使用する

3
Pramod Deshmukh

クエリを次のように変更することもできます。

SELECT ename, empno, (SELECT ename FROM EMP WHERE empno = e.mgr)AS MANAGER, mgr 
from emp e 
order by empno;

これは、内部empテーブルの場合、empnoを外部テーブルのmgr列と一致させる必要があることをエンジンに伝えます。 enter image description here

3
Lambs

おそらくあなたのサブクエリ(SELECT ename FROM EMP WHERE empno = mgr)と思う、自分のマネージャーである従業員レコードを教えてください! (つまり、行のempnoは同じ行のmgrと同じです。)

おそらく、これを書き換えて内部(自己)結合を使用することを検討しましたか? (私は、次がうまくいくかどうかさえわからないので、尋ねています。)

SELECT t1.ename, t1.empno, t2.ename as MANAGER, t1.mgr
from emp as t1
inner join emp t2 ON t1.mgr = t2.empno
order by t1.empno;
2
Funka