programing

관리자와 직원을 연결하는 방법

skycolor 2023. 10. 9. 22:25
반응형

관리자와 직원을 연결하는 방법

이것이 제가 원하는 출력의 모습입니다.

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개의 행을 선택.

이것은 전형적인 자기 결합입니다. 다음을 시도해 보십시오.

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
(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;

편집:

당신이 선택한 답변은 내부 합류이기 때문에 당신의 회장을 나열하지 않을 것입니다.결과물이 숙제에 필요한 것이 아니라는 것을 알게 되면 돌아올 것이라고 생각합니다.실제 테스트 사례는 다음과 같습니다.

> 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)

쿼리를 다음과 같이 변경할 수도 있었습니다.

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

이는 엔진이 내부 빈 공간의 경우 외부 테이블의 mgr 열과 empno를 일치시켜야 함을 의미합니다.enter image description here

먹어보기

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

하위 쿼리 대신 자체 조인 사용

아마도 당신의 서브쿼리.(SELECT ename FROM EMP WHERE 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;

다음은 이 질문에 대한 대체 답변입니다. 셀프 조인을 사용하는 대신 '계층적 쿼리' 옵션을 선택할 수 있습니다.빠르고 조인에 비해 여러 장점이 있습니다.

SELECT ename as employee, empno, prior ename as manager, prior empno as mgrno
FROM emp
start with mgr is null
connect by mgr = prior empno;

언급URL : https://stackoverflow.com/questions/7451761/how-to-get-the-employees-with-their-managers

반응형