YOO
article thumbnail
Published 2023. 6. 11. 21:03
Merge Studying/SQL

 

  • MERGE 문을 사용하면 변경할 테이블에 데이터가 존재하는지 체크하고, UPDATE, DELETE, INSERT를 한 번에 작업이 가능

 

  • MERGE 문의 경우 단일(한개의) 테이블에 UPDATE 또는 INSERT를 하는 경우 많이 사용하지만, 두개의 테이블을 비교하거나 서브 쿼리의 결과에 따라서 UPDATE, INSERT 작업이 가능

 

 



MERGE INTO 변경할 테이블

USING 기준 테이블 | 서브쿼리
ON 조건문
WHEN MATCHED THEN 조건을 만족할 경우
UPDATE SET 컬럼 = '값'
DELETE WHEN NOT MATCHED THEN 조건을 만족하지 않을 경우
INSERT (컬럼) VALUES ('값')

 

 


MERGE 변경될테이블명 AS A
USING 기준테이블명 AS B
ON A.컬럼명 = B.컬럼명
WHEN MATCHED THEN 일치할때쿼리문
WHEN NOT MATCHED
THEN 불일치할때쿼리문

 


MERGE 변경될테이블명 AS A
USING ( SELECT 컬럼명 FROM 기준테이블명) AS B
ON (A.컬럼명 = B.컬럼명 AND A.컬럼명 = B.컬럼명)
WHEN MATCHED AND 조건
THEN INSERT (A.컬럼명) VALUES (B.컬럼명)
WHEN NOT MATCHED AND 조건
THEN UPDATE SET A.컬렴명 = B.컬럼명
WHEN NOT MATCHED AND 조건
THEN DELETE

 

 

 

 

단일테이블일 경우

오라클에서는 dual 로 사용가능 하지만 MYSQL에서는 없기 때문에 안에 서브쿼리를 넣어서 사용

USING (SELECT 1 AS dual)

 

 

 

EX)


 -- 분류와 제품컬럼을 기준으로 비교

MERGE #TEMP_A AS A       

USING ( SELECT 사유, 분류, 제품, 가격 FROM #TEMP_B) AS B
ON (A.분류 = B.분류 AND A.제품 = B.제품)

-- 1. 분류컬럼과 제품컬럼의 값이 일치한 행이 존재하지 않고, 해당 행의 사유컬럼의 값이 '새제품'일 경우
(분류와 제품 컬럼을 기준으로 #TEMP_B와 #TEMP_A에 동일한 값이 존재하지 않고,#TEMP_B에서 
사유 칼럼의 값이 '새 제품'이라면해당 데이터를 #TEMP_A에INSERT 한다.)
WHEN NOT MATCHED AND B.사유 = '새제품'
THEN INSERT (분류, 제품, 가격) VALUES (B.분류, B.제품, B.가격)

-- 2. 분류컬럼과 제품컬럼의 값이 일치한 행이 존재하고, 해당 행의 사유컬럼의 값이 '손상'일 경우
(분류와 제품칼럼을 기준으로 #TEMP_B와 #TEMP_A에 동일한 값이 존재하고,

#TEMP_B에서 사유 칼럼의 값이 '손상'이라면
해당하는 #TEMP_A의 데이터에서 제품명을 '수선한' + 기존 제품명으로 UPDATE 한다.)
WHEN MATCHED AND B.사유 = '손상'
THEN UPDATE SET 제품 = ( '수선한 ' + B.제품)

-- 3. 분류컬럼과 제품컬럼의 값이 일치한 행이 존재하고, 해당 행의 사유컬럼의 값이 '상함'일 경우
(분류와 제품칼럼을 기준으로 #TEMP_B와 #TEMP_A에 동일한 값이 존재하고,

#TEMP_B에서 사유 칼럼의 값이 '상함'이라면 #TEMP_A의 해당 데이터를 DELETE 한다.)
WHEN MATCHED AND B.사유 = '상함'
THEN DELETE;

 

 

 

 

 

 

 

 

 

 

 

 

 

'Studying > SQL' 카테고리의 다른 글

[MyBatis] #{ } 와 ${ } 개념과 차이점  (0) 2023.07.17
LISTAGG 함수  (0) 2023.07.05
데이터 타입  (0) 2023.05.12
파티셔닝(Partitioning)  (0) 2023.05.11
INSERT INTO SELECT문 / SELECT INTO문  (0) 2023.05.04

검색 태그