Mssql 에서는 IF EXISTS 함수를 사용해 값이 존재하는지 확인 후
값이 있을때와 없을때 다른 쿼리를 사용 할 수 있다.
oracle에서는 MERGE 함수를 사용해 유사한 기능을 구현 할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | MERGE INTO TBL_NAME -- table명 USING DUAL ON (column1 = '존재하는지 확인할 값') WHEN MATCHED THEN -- 존재하는 경우 실행 UPDATE SET column2= 'update할 값1', column3= 'update할 값2' WHEN NOT MATCHED THEN -- 존재하지 않는 경우 실행 INSERT (column1, column2, column3) VALUES ('존재하는지 확인할 값','insert할 값1', 'insert할 값2') | cs |
위와 같은 쿼리문을 작성하면 된다
더 간단하게 나타내자면
1 2 3 4 5 6 7 8 | MERGE INTO TBL_NAME -- table명 USING DUAL ON (column1 = '존재하는지 확인할 값') WHEN MATCHED THEN -- 값이 존재하 경우 실행할 쿼리 WHEN NOT MATCHED THEN -- 값이 존재하지 않을 경우 실행할 쿼리 | cs |
이렇게 나타낼 수 도 있으며
좀더 응용하자면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | merge into target_table tt using ( -- 조인하는 테이블 select te.te_cd tt_cd ,te.description tt_disp ,te.jt_no jt_no ,decode(te.is_flag, 'normal', 'Y', 'N') is_flag from temp_table te left join join_table jt on te.te_no=jt.jt_no where 1=1 ) so on (tt.tt_cd=so.tt_cd and tt.jt_no=so.jt_no) -- 조인한 테이블의 값 when matched then update set tt.is_flag=so.is_flag ,tt.tt_disp=so.tt_disp when not matched then insert (tt_no, tt_cd, tt_disp, jt_no, is_flag, reg_date) values( sq_target_table.nextval , so.tt_cd , so.tt_disp , so.jt_no , so.is_flag , sysdate ); | cs |
(코드 출처 : http://yangtaeho.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4-MERGE-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-update-insert-%EB%8F%99%EC%8B%9C%EC%97%90
http://zinlee.tistory.com/185 에서 더 자세한 내용을 확인할 수 있습니다.
)
이렇게 사용 할 수도 있다. 단순히 한 테이블에 대해서만 값이 존재하는지 확인 하는 것이 아니라
조인했을때의 값도 활용 할 수가 있다.
'Yame Programmer > SQL' 카테고리의 다른 글
[sql 튜닝] 이론 임시 내용[하드 파싱 소프트 파싱 캐시 블락] (0) | 2016.10.27 |
---|---|
[sql튜닝] cmd 명령문 실행 계획 (0) | 2016.10.27 |
[Oracle] java.sql.SQLException: ORA-00911: 문자가 부적합합니다. (1) | 2016.10.05 |
[MSSQL] mssql에서 dual과 같은 가상 테이블 사용 하기 (0) | 2016.08.12 |
[MSSQL] 값이 존재하는지 확인 후 update insert [EXISTS] 활용 (0) | 2016.08.12 |