yunsh206

회원가입로그인

컴퓨터 Oracle의 Merge

2007.10.01 18:29

RanomA 조회 수:1160

Merge를 사용하여 row 삽입 merge를 하려고 하는 source 테이블의 행을 읽어 target 테이블에 매치되는 행이 있을 경우에는 새로운 값으로 UPDATE를 수행하고,
만일 매치되는 행이 없을 경우에는 새로운 행으로 인식하여 target 테이블에 INSERT를 수행한다.

merge 문을 수행하기 위해서는 다음과 같은 권한이 주어져야 한다.
- target 테이블 새로운 행을 삽입하기 위한 insert 권한.
- target 테이블에서 기존 행을 갱신하기 위한 update 권한.
- source 테이블 행을 검색하기 위한 SELECT 권한.

【형식】

    MERGE INTO 테이블명 alias
    USING [테이블명 | 뷰명 | subquery] alias
    ON 조건
    WHEN MATCHED THEN
        UPDATE SET 컬럼1=값1,
                   컬럼2=값2...
    WHEN NOT MATCHED THEN
        INSERT (컬럼1,컬럼2,...)
        VALUES(값1,값2,...);

- merge into 뒤에 테이블을 삽입하거나 target 테이블명을 지정한다.
- WHERE 절은 사용할 수 없고, 대신 ON 절에 JOIN 조건을 기술한다.
- WHEN MATCHED THEN 절에는 ON 절에서 기술한 JOIN 조건을 만족하는 즉, source 테이블과 target 테이블간에 매치되는 행이 존재할 경우 target 테이블의 행을 새로운 값으로 UPDATE하기 위한 구문을 기술한다.
- WHEN NOT MATCHED THEN 절에는 ON 절에서 기술한 JOIN 조건을 만족하지 않는 경우 즉, target 테이블에 행을 INSERT하기 위한 구문을 기술한다.
- WHEN MATCHED THEN 절과 WHEN NOT MATCHED THEN 절에는 테이블명 대신 alias를 사용한다.

【예제】

SQL> CREATE TABLE dept1
  2  AS SELECT * FROM dept;

테이블이 생성되었습니다.

SQL> CREATE TABLE dept2
  2  AS SELECT * FROM dept;

테이블이 생성되었습니다.

SQL> INSERT INTO dept2 VALUES(50,'KIM_gun','COREA');

1 개의 행이 만들어졌습니다.

SQL> UPDATE dept2
  2  SET dname='LEE_gun' WHERE deptno=30;

1 행이 갱신되었습니다.

SQL> SELECT * FROM dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 LEE_gun        CHICAGO
        40 OPERATIONS     BOSTON
        50 KIM_gun        COREA

SQL> SELECT * FROM dept1;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SQL> MERGE INTO dept1 d
  2   USING dept2 de
  3   ON (d.deptno=de.deptno)
  ☜ ON 조건절에 들어 있는 컬럼은 update절에 넣으면 오류발생
  4   WHEN MATCHED THEN
  5     UPDATE SET
  6        d.dname=de.dname,
  7        d.loc=de.loc
  8   WHEN NOT MATCHED THEN
  9     INSERT VALUES(de.deptno, de.dname, de.loc);

5 행이 병합되었습니다.

SQL> SELECT * FROM dept1;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 LEE_gun        CHICAGO
        40 OPERATIONS     BOSTON
        50 KIM_gun        COREA



테이블  aa
1111홍길동
2222길동무
3333죽마고우


MERGE전 bb의 내용
1111홍길동
2222옛친구


테이블 aa를 bb로 MERGE 후 bb의 내용
1111홍길동
2222길동무
3333죽마고우


위의 내용을 표현하는 스크립트가 아래와 같다.


SQL> CREATE TABLE aa(id number(4), name varchar2(10));

테이블이 생성되었습니다.

SQL> CREATE TABLE bb (id number(4), name varchar2(10));

테이블이 생성되었습니다.

SQL> INSERT INTO aa VALUES(1111,'홍길동');

1 개의 행이 만들어졌습니다.

SQL> INSERT INTO aa VALUES(2222,'길동무');

1 개의 행이 만들어졌습니다.

SQL> INSERT INTO aa VALUES(3333,'죽마고우');

1 개의 행이 만들어졌습니다.

SQL> INSERT INTO bb VALUES(1111,'홍길동');

1 개의 행이 만들어졌습니다.

SQL> INSERT INTO bb VALUES(2222,'옛친구');

1 개의 행이 만들어졌습니다.

SQL> SELECT * FROM aa;

        ID NAME
---------- ----------
      1111 홍길동
      2222 길동무
      3333 죽마고우

SQL> SELECT * FROM bb;

        ID NAME
---------- ----------
      1111 홍길동
      2222 옛친구

SQL> MERGE INTO bb target
  2  USING aa source
  3  ON (source.id=target.id)
  4  WHEN MATCHED THEN
  5     UPDATE SET
  6        target.name=source.name
  7  WHEN NOT MATCHED THEN
  8     INSERT VALUES(source.id,source.name);

3 행이 병합되었습니다.

SQL> SELECT * FROM bb;

        ID NAME
---------- ----------
      1111 홍길동
      2222 길동무
      3333 죽마고우

SQL>


번호 제목 글쓴이 날짜 조회 수 추천 수
183 리눅스 SSH Network error: Software caused connection abort RanomA 2021.05.29 2018 0
182 인터넷 기본 설정 복원 창 띄우는 방법들 file RanomA 2021.05.01 1025 0
181 리눅스 디렉토리별 압축 파일 생성 쉘 스크립트 RanomA 2021.04.04 832 0
180 Javascript 숫자에 끊어 읽기 컴마(,) 추가 RanomA 2020.11.27 752 0
179 Javascript 문자열을 포맷 맞춰 날짜로, 날짜를 포맷 맞춘 문자열로 변환 RanomA 2020.11.26 719 0
178 Javascript 날짜 더하기 RanomA 2020.11.26 451 0
177 Javascript 해당 연월의 마지막 날짜 가져오기 RanomA 2020.11.25 365 0
176 Javascript isNullOrEmpty RanomA 2020.11.25 686 0
175 Javascript 전화번호 포매팅 RanomA 2020.11.25 2309 0
174 Javascript IN RanomA 2020.11.18 261 0
173 Javascript LPAD RanomA 2020.11.17 582 0
172 Adobe Creative Cloud 업데이트 실패 184(혹은 C184) 오류 file RanomA 2020.09.08 1073 0
171 오라클 테이블 레이아웃 조회 Query RanomA 2020.01.13 2064 0
170 SQL Developer의 폰트 설정에서 폰트 목록이 안나타날 때 [6] file RanomA 2019.12.30 4877 0
169 Underscore( _ 문자)를 카멜 케이스(Camel Case)로 변환하기 RanomA 2019.12.06 1815 0
168 라이트룸(Adobe Lightroom) 한자/일본어용 폰트 변경 file RanomA 2018.06.06 2145 0
167 입력기(IME)에 EN - 영어(미국) 키보드 US 가 표시될 때 [1] file RanomA 2016.05.03 1456 0
166 Thunderbolt 3와 USB-C RanomA 2016.04.28 682 0
165 ATOK 단축키 설정을 했는데도 입력 모드 변경이 잘 안될 때 file RanomA 2016.04.21 503 0
164 ATOK 단축키 설정 file RanomA 2016.04.18 563 0