hyeonga_code

Database_38_Oracle JOIN_ OUTER JOIN, SELF JOIN, 3 WAY JOIN 본문

Oracle Database

Database_38_Oracle JOIN_ OUTER JOIN, SELF JOIN, 3 WAY JOIN

hyeonga 2023. 8. 1. 07:59
반응형

-- 오라클 조인
    -- FROM 절에 JOIN 키워드를 사용하지 않습니다.
    -- 조인 조건을 WHERE 절에 작성합니다.
        -- n 개의 테이블 조인을 위해 최소 n-1개의 조인 조건이 필요합니다.
    -- 행을 제한하기 위해 WHERE 절에 조건을 추가해야 하는 경우 AND 연산자를 사용합니다.
    /*
    SELECT table1.column1, table2.column2
    FROM table1, table2
    WHERE table1.column1 = table2.column2;
    */
    
    -- Outer JOIN
        -- (+) 아우터 조인 연산자를 정보가 부족한 조인 옆에 작성합니다.
        -- 아우터 조인 연산자는 하나 이상의 널 행을 생성합니다.
        
    -- LEFT OUTER JOIN
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id);
    /*
    EM_ID   LAST_NAME  SALARY  DP_ID        
    -------------------------------------------------------

    100         King               24000        90
    101         Kochhar         17000        90
    102         De Haan         17000        90
    ...

    */


        -- 왼쪽 데이터를 확인 할 경우 오른쪽 데이터에 null 값을 추가해야합니다.
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e, departments d
WHERE e.department_id = d.department_id(+);
    /*
    EM_ID   LAST_NAME  SALARY  DP_ID        
    -------------------------------------------------------

    100         King                24000        90
    101         Kochhar         17000         90
    102         De Haan         17000        90
    ...
    */


    
    -- RIGHT OUTER JOIN
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id);
    /*
    EM_ID   LAST_NAME  SALARY  DP_ID        
    -------------------------------------------------------

    100         King               24000        90
    101         Kochhar         17000        90
    102         De Haan         17000        90
    ...
    */


        -- 오른쪽 데이터를 확인 할 경우 왼쪽 데이터에 null 값을 추가해야합니다.
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id;
    /*
    EM_ID   LAST_NAME  SALARY  DP_ID        
    ------------------------------------------------------
    100         King               24000        90
    101         Kochhar         17000        90
    102         De Haan        17000        90
    ...
    */



    -- FULL OUTER JOIN을 지원하지 않습니다.
        -- 한 문장에 (+)를 한 번만 지원합니다.
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e FULL OUTER JOIN departments d
ON (e.department_id = d.department_id);
    -- 1)
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id(+);
    -- 2)
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id(+);
    /*
        <오류>---------------------------------------------------------------------------
            ORA-01468: a predicate may reference only one outer-joined table
            01468. 00000 -  "a predicate may reference only one outer-joined table"
            *Cause:    
            *Action:
            103행, 26열에서 오류 발생      
        -----------------------------------------------------------------------------------
    */

        -- FULL OUTER JOIN과 동일한 결과를 얻기 위함
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e, departments d
WHERE e.department_id(+) = d.department_id
UNION
SELECT e.employee_id, e.last_name, e.salary, d.department_id
FROM employees e, departments d
WHERE e.department_id = d.department_id(+);
        -- 총 21개의 데이터가 출력됩니다.
    /*
    EM_ID  LAST_NAME  SALARY    DP_ID        
    --------------------------------------------------------
    100         King               24000         90
    101         Kochhar         17000         90
    102         De Haan        17000         90
    ...
    */



    -- SELF JOIN
SELECT e.employee_id, e.last_name, e.salary, e.manager_id, m.last_name
FROM employees e JOIN employees m
ON (e.manager_id = m.employee_id)
WHERE e.commission_pct IS NULL
ORDER BY 3;
    /*
    EM_ID   LAST_NAME  SALARY   M_ID     LAST_NAME_1  
    -------------------------------------------------------------------------------
    144         Vargas           2500        124             Mourgos        
    143         Matos            2600        124             Mourgos        
    142         Davies           3100        124             Mourgos        
    ...        
    */



SELECT e.employee_id, e.last_name, e.salary, e.manager_id, m.last_name
FROM employees e, employees m
WHERE e.manager_id = m.employee_id
AND e.commission_pct IS NULL
ORDER BY 3;
    /*
    EM_ID   LAST_NAME  SALARY   M_ID     LAST_NAME_1  
    -------------------------------------------------------------------------------

    144         Vargas            2500        124             Mourgos        
    143         Matos              2600        124             Mourgos        
    142         Davies            3100        124             Mourgos        
    ...     
    */


    
    -- 3-way JOIN
SELECT e.employee_id, e.last_name, e.job_id, d.department_name, l.city
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
JOIN locations l
ON (d.location_id = l.location_id);
    /*
    EM_ID   LAST_NAME    JOB_ID              DP_NAME         CITY        
    ------------------------------------------------------------------------------------

    100         King                 AD_PRES       Executive        Seattle        
    101         Kochhar           AD_VP            Executive        Seattle        
    102         De Haan           AD_VP            Executive       Seattle        
    ...     
    */



SELECT e.employee_id, e.last_name, e.job_id, d.department_name, l.city
FROM employees e, departments d, locations l
WHERE e.department_id = d.department_id
AND d.location_id = l.location_id;
    /*
    EM_ID   LAST_NAME    JOB_ID              DP_NAME         CITY        
    ------------------------------------------------------------------------------------
    100         King                 AD_PRES           Executive       Seattle        
    101         Kochhar          AD_VP                 Executive       Seattle        
    ...
    */

 

반응형