본문 바로가기

DB/Oracle

[Oracle] 오라클 MERGE문 & 다중테이블에서 조건찾아 UPDATE하기!! & EXISTS 연산

'MERGE'란 하나 혹은 그 이상의 테이블에 대한 INSERT, UPDATE 작업을 위해 하나 혹은 그 이상의 소스로부터 질의할 때 사용하는 명령어
여러 번의 INSERT, UPDATE나 DELETE 작업을 피할 수 있는 방법

 

------------------------------------------------------------------------------------------------------------------------------------------------------
문법)


MERGE INTO 테이블이름
USING SELECT (구문)
ON (조건)


WHEN MATCHED THEN
   UNDATE SET [WHERE] (구문)
   DELETE [WHERE] (구문)
WHEN NOT MATCHED THEN
   INSERT VALUES (구문)
   [WHERE] (구문)

;

예시)

MERGE INTO bonuses b
USING (SELECT employee_id, salary, department_id FROM employees) e
ON (e.employee_id = b.employee_id)
WHEN MATCHED THEN
   UPDATE SET bonus = bonus + salary * 0.1
   DELETE WHERE salary > 8000
WHEN NOT MATCHED THEN
   INSERT VALUES (e.employee_id, salary * 0.1)
   WHERE salary <= 8000


;

 

직접짠쿼리)

맞는 문법이나, 회사 서버가 구닥다리라서 지원안함..... 이거때매 멘붕이였음 ㅠ

# 오라클 9i 에서는 ORA-00905: 누락된 키워드 라는 에러가 뜬다........  테스트 서버인 오라클 11g 에서는 잘 작동하는거 확인....  아마 오라클 10 이상부터 MERGE를 지원해준다고 들은거같다.... #

MERGE INTO SALES_1 B
USING  SALES_CUSTOMER_CONTROL A
ON (A.SALES_CODE = B.SALES_CODE AND A.CONTROL_GUBUN ='1')
WHEN MATCHED THEN
             UPDATE SET B.DEPT_CODE='390100'
                      , B.EMP_NO='120105'


;


-------------------------------------------------------------------------------------------------------------------------------------------------------

다중테이블에서 조건찾아 UPDATE하기!! (위에 MERGE가 안먹혀서, 공부한 방법)

UPDATE SALES_1 B
SET B.DEPT_CODE='390100',
    B.EMP_NO='120105'
WHERE EXISTS (SELECT 1 
              FROM SALES_CUSTOMER_CONTROL A 
              WHERE A.SALES_CODE = B.SALES_CODE
                AND A.CONTROL_GUBUN ='1')

 

------------------------------------------------------------------------------------------------------------------------------------------------------

Exists 연산자

 

두 테이블 간의 결과를 어떤 값이 존재하는 지를 알고 싶은 경우,

새로운 데이터를 입력할 때 해당 데이터가 이미 존재하는지 확인할 때도 유용하다.

핵심은 '존재하는가'를 판단하는 것.

 

- 서브쿼리 앞에 사용하는 연산자

- 서브쿼리 결과의 TRUE(메인 쿼리 행 출력) / FALSE(메인쿼리 행 생략) 값을 메인쿼리에 전달

- not exists 로 부정연산 가능

 

예시) SELECT *         FROM 테이블 A

         WHERE EXISITS (SELECT ................)

 

사용법)

SELECT *
FROM SALES_1 B
 WHERE EXISTS (SELECT 1 
               FROM SALES_CUSTOMER_CONTROL A 
               WHERE A.SALES_CODE = B.SALES_CODE
                 AND A.CONTROL_GUBUN ='1')