Merge
MERGE는 기존에 있던 행은 업데이트를 하고 새롭게 입력된 정보는 INSERT를 한꺼번에 행하는 과정ㅇ다.
신체검사과정을 예로 생각해보자
1. 2009년도 학생별 신체검사 테이블을 만들어보자.
JUBUN 주민번호, NAME 이름, HEIGHT 키, WEIGHT 몸무게, CHECKDAY 검사날짜를 의미한다.
CREATE TABLE TBL_BODY_2009
(JUBUN VARCHAR2(20)
,NAME VARCHAR2(20)
,HEIGHT NUMBER
,WEIGHT NUMBER
,CHECKDAY DATE DEFAULT SYSDATE
)
검사결과값을 입력해보자.
INSERT INTO TBL_BODY_2009 VALUES
('020505-34456','JOHN', 120, 20, TO_DATE('2009-04', 'YYYY-MM'));
INSERT INTO TBL_BODY_2009 VALUES
('020605-34421','MICHEAL', 125, 27, TO_DATE('2009-04', 'YYYY-MM'));
INSERT INTO TBL_BODY_2009 VALUES
('020705-44326','MILLEN', 127, 23, TO_DATE('2009-04', 'YYYY-MM'));
2. 현제 신체검사 정보라는 테이블을 만든다.
최인이라함은
이 테이블은 나중에 새로운 신체검사 결과를 입력하더라도 늘 최신 결과물을 저장해야하는 테이블임을 유념해두자
CREATE TABLE TBL_BODY_CURRENT
(JUBUN VARCHAR2(13)
,NAME VARCHAR2(20)
,HEIGHT NUMBER
,WEIGHT NUMBER
,CHECKDAY DATE
)
1,2 과정에서 테이블을 확인해보면 TBL_BODY_2009 테이블에는 신체검사결과가 올라왔고 아직
TBL_BODY_CURRENT 테이블에는 값이 없다.
SELECT *
FROM TBL_BODY_2009;
SELECT *
FROM TBL_BODY_CURRENT
위 : TBL_BODY_2009;
아래 : TBL_BODY_CURRENT
3. CURRENT는 최신 신체검사 결과를 저장해야하므로 2009년 검사 결과를 CURRENT 테이블에 넣어보자
MERGE INTO TBL_BODY_CURRENT A
USING TBL_BODY_2009 B
on (A.JUBUN=B.JUBUN)
WHEN MATCHED THEN UPDATE SET A.NAME=B.NAME
,A.HEIGHT=B.HEIGHT
,A.WEIGHT=B.WEIGHT
,A.CHECKDAY=B.CHECKDAY
WHEN NOT MATCHED THEN INSERT(JUBUN,NAME,HEIGHT,WEIGHT,CHECKDAY)
VALUES(B.JUBUN, B.NAME, B.HEIGHT, B.WEIGHT, B.CHECKDAY);
이 명령은 다음과 같다.TBL_BODY_2009; 테이블들의 행을 TBL_BODY_CURRENT 테이블에 넣는데
만일 두 테이블에 공통된 값인 주민번호 column을 이용해서 주민번호칼럼이 같은것이 있다면
기존자료를 새로운 신체검사 결과로 업데이트하고 ,아니면 새로운 값은 INSERT 한다는 것이다.
사실 여기서는 TBL_BODY_CURRENT 에 아무런 데이터도 없기때문에 NOT MATCED 구문만이 실행된다.
4. 2010년도 새로운 신체검사를 했고 데이터값을 넣어보자.
<업데이트> 2009년도 신체검사를 했던 사람들이 2010년 또 다시 검사결과를 했다. 이결과값을 TBL_BODY_2010 이라는
테이블을 만든후에 저장해보자
CREATE TABLE TBL_BODY_2010
(JUBUN VARCHAR2(20)
,NAME VARCHAR2(20)
,HEIGHT NUMBER
,WEIGHT NUMBER
,CHECKDAY DATE DEFAULT SYSDATE
)
INSERT INTO TBL_BODY_2010 VALUES
('020505-34456','JOHN', 130, 28, TO_DATE('2010-04', 'YYYY-MM'));
INSERT INTO TBL_BODY_2010 VALUES
('020605-34421','MICHEAL', 138, 35, TO_DATE('2010-04', 'YYYY-MM'));
INSERT INTO TBL_BODY_2010 VALUES
('020705-44326','MILLEN', 131, 29, TO_DATE('2010-04', 'YYYY-MM'));
<새로운 데이터 추가>- 아직 신체검사를 하지 않은 새로운 사람들의 경우도 넣어보자.
INSERT INTO TBL_BODY_2010 VALUES
('030909-44456','EMILY', 125, 23, TO_DATE('2010-04', 'YYYY-MM'));
INSERT INTO TBL_BODY_2010 VALUES
('030609-34455','DERECK', 121, 20, TO_DATE('2010-04', 'YYYY-MM'));
5. 다시 검사결과를 CURRENT 테이블에 업데이트하자.
아까도 이야기 했다시피 CURRENT 테이블의 경우는 늘 최신의 결과값을 유지해야함을 기억하자.
MERGE INTO TBL_BODY_CURRENT A
USING TBL_BODY_2010 B
on (A.JUBUN=B.JUBUN)
WHEN MATCHED THEN UPDATE SET A.NAME=B.NAME
,A.HEIGHT=B.HEIGHT
,A.WEIGHT=B.WEIGHT
,A.CHECKDAY=B.CHECKDAY
WHEN NOT MATCHED THEN INSERT(JUBUN,NAME,HEIGHT,WEIGHT,CHECKDAY)
VALUES(B.JUBUN, B.NAME, B.HEIGHT, B.WEIGHT, B.CHECKDAY)
여기서는 기존에 있던 데이터값이 있으므로 MATCHED 구문이 적용된다. 이것은 업데이트되고
새로운 신체검사를 한 사람들의 데이터는 NOT MATCHED 구문이 적용되서 새롭게 INSERT된다.
결과를 보면 적용이 되였음을 확인할 수 있다.
'오라클 10g' 카테고리의 다른 글
PL/SQL - 기본 구조 (0) | 2010.12.08 |
---|---|
WITH ~AS 서브쿼리문 (0) | 2010.12.07 |
분할테이블 partition table (0) | 2010.12.07 |
MULTI INSERT (0) | 2010.12.07 |
오라클 데이터 복사후 다른 호스트에서 사용하기 (0) | 2010.12.06 |