본문 바로가기
컴퓨터관련/MS-SQL

[MS-SQL]MERGE로 다중조건 UPDATE,INSERT,DELETE 하기

by 빛과 어둠사이 2020. 2. 7.
728x90
반응형
SMALL

얼마 전에 MS-SQL에서 MERGE로 

INSERT / UPDATE를 한번에 하는 것을

정리를 했었습니다.


https://sagittariusof85s.tistory.com/182?category=838602


그 때, 좀 더 심화된 사용방법은

다시 정리한다고 했었는데

이번에는 MERGE에 대한

좀 더 심화된 방법에 대해서

정리를 해 보려고 합니다.




지난번에는 한가지 조건에 대해서

데이터를 비교해서 참일경우,

UPDATE

아닐경우, INSERT만 했었습니다.


이번에는 참이면서도

세부 조건을 추가적으로 설정하여

세부 조건까지 비교하여

여러 동작을 하도록

머지문을 이용하여

한번에 처리하도록 쿼리를 작성해보도록 하겟습니다.




기본적인 사용방법은 다음과 같습니다.

MERGE INTO test_member  --INSERT/UPDATE 할 테이블
 USING (SELECT 1 AS DUM) X 
      ON (기본조건) --기본조건
    WHEN MATCHED AND 조건2 THEN --기본조건에 맞으면서, 조건2도 맞으면
        
    WHEN NOT MATCHED AND 조건3 THEN --기본 조건에 맞는 데이터가 없으면서 조건3에 맞는 데이터가 있으면
        
	WHEN NOT MATCHED THEN -- 기본 조건도 안맞고, 조건3도 안맞으면
		
;

지난번에 했던 MERGE문과

거의 비슷한 상황입니다.

우선, 기본조건을 설정하는 것은

동일합니다.


다만, 기본조건에 대해서 참일 때,

거짓일 때

추가적으로 조건을 추가할 수 있습니다.


MATCHED, NOT MATCHED 모두

조건을 추가로 걸 수 있습니다.




이제 실제 예제를 위해서

우선 제가 확인할 테이블에 대해서

데이터를 조회해 보았습니다.

SELECT * FROM test_member

위처럼 테이블을 조회하여

아래처럼 데이터가 있는 것을

확인할 수 있습니다.





그러면 이제 실제 사용 예제를 보도록 하겠습니다.

기본 조건에 세부조건까지 맞으면

UPDATE

아니면 INSERT를 하도록

MERGE문을 작성해 보았습니다.


MERGE INTO test_member  --INSERT/UPDATE 할 테이블
 USING (SELECT 1 AS DUM) X 
      ON (id= 'hhh') --기본조건
    WHEN MATCHED AND member_name = '홍길동' THEN --기본조건에 맞으면서, 조건2도 맞으면
            UPDATE SET
            member_name = '하늬'
	WHEN NOT MATCHED THEN -- 기본 조건도 안맞고, 조건3도 안맞으면
		INSERT (id, member_name)
            VALUES(
                'jjj'
                , '송준기'
            )
;

위처럼 작성을 하였습니다.

그리고 실행을 하면,

결과는 다음과 같이 나오게 됩니다.



위처럼 0개의 행이 영향을 받았다고 나옵니다.

그 이유는 다음과 같습니다.

분명 데이터를 보면 id가 hhh인 데이터는 있습니다.

그래서 MATCHED로 들어가집니다.


그런데, id가 hhh인 데이터에서

member_name값은 홍길동이 아닙니다.

그렇기 때문에 이 세부조건에 맞지 않아서

UPDATE를 실행하지는 않는 것입니다.



혹시 모르니

다시 해당 테이블을 조회해 보았습니다.

SELECT * FROM test_member

위처럼 쿼리를 작성하여

돌려보았습니다.

그랬더니 결과는 다음과 같이 나왔습니다.




위처럼 변경이 안된 것을

확인할 수 있습니다.





그러면 이번에는 쿼리를 변경해 보았습니다.

MERGE INTO test_member  --INSERT/UPDATE 할 테이블
 USING (SELECT 1 AS DUM) X 
      ON (id= 'jjj') --기본조건
    WHEN MATCHED AND member_name = '홍길동' THEN --기본조건에 맞으면서, 조건2도 맞으면
            UPDATE SET
            member_name = '하늬'
	WHEN MATCHED AND member_name = '송준기'  THEN  --기본 조건에 맞는 데이터가 없으면서 조건3에 맞는 데이터가 있으면
            DELETE
	WHEN NOT MATCHED THEN -- 기본 조건도 안맞고, 조건3도 안맞으면
		INSERT (id, member_name)
            VALUES(
                'jjj1'
                , '송준기'
            )
;

위처럼 작성을 하였습니다.

위 쿼리는 id가 jjj이면서

member_name이 홍길동이면, 하늬로 수정(UPDATE)

id가 jjj이면서 member_name이 송준기이면 삭제(DELETE)

id가 jjj인 데이터가 없으면 추가입력(INSERT)

위처럼 하도록 쿼리를 작성한 것입니다.


위 쿼리를 실행시켜 보았습니다.




1개 행이 적용이 되었다고 나와졌네요.

그러면 다시 데이터를 확인하기 위해

해당 테이블을 조회해 보았습니다.

SELECT * FROM test_member


위처럼 조회를 해 보았더니

아래처럼 결과가 나왔습니다.



위처럼 id가 jjj 데이터가 삭제가 되었습니다.

id가 jjj이면서 member_name이 송준기였기 때문에

삭제가 된 것을

확인할 수 있습니다.




그러면 위 쿼리를 다시 실행해 보겠습니다.

MERGE INTO test_member  --INSERT/UPDATE 할 테이블
 USING (SELECT 1 AS DUM) X 
      ON (id= 'jjj') --기본조건
    WHEN MATCHED AND member_name = '홍길동' THEN --기본조건에 맞으면서, 조건2도 맞으면
            UPDATE SET
            member_name = '하늬'
	WHEN MATCHED AND member_name = '송준기'  THEN  --기본 조건에 맞는 데이터가 없으면서 조건3에 맞는 데이터가 있으면
            DELETE
	WHEN NOT MATCHED THEN -- 기본 조건도 안맞고, 조건3도 안맞으면
		INSERT (id, member_name)
            VALUES(
                'jjj1'
                , '송준기'
            )
;

위 쿼리는 아까 위에서 DELETE 했던 것과

동일한 쿼리입니다.

해당 쿼리를 돌렸더니

결과는 아래처럼 나왔습니다.



위처럼 1개 행이 적용되었다고 나와지네요.

그러면 이제 해당 테이블에는

데이터가 어떻게 변경이 되었는지

확인을 해 보도록 하겠습니다.




해당 테이블을 다시 조회해 보았습니다.

SELECT * FROM test_member

위처럼 해서 다시 실행을 해보았습니다.

그랬더니 결과는 아래처럼 나왔습니다.



위처럼 id가 jjj1인 데이터가

추가가 된 것을

확인할 수 있습니다.


id가 jjj인 데이터가 없었기 때문에

바로 INSERT를 하게 된 것을

확인할 수 있습니다.





이렇게 기본 조건에

세부 조건까지 추가하여

INSERT / UPDATE / DELETE를 하는

머지문 작성방법을 알아보았습니다.


한가지 조건일 때문에 하는 것이 아니기 때문에

활용성은 더 높다고 생각을 합니다.

이와 같은 MERGE문을 이용하여

쿼리를 작성할 때 편하게 작성하면 좋을 것 같습니다.




이상으로 SQL SERVER에서의 MERGE문을 이용,

INSERT / UPDATE / DELETE를 

여러 조건에 맞게 한번에 하는 방법이였습니다~



728x90
반응형
LIST