데이터 입력/수정/삭제를 한 번에 처리할 수 있는 MERGE에 대해 알아보자

 

 

MERGE

 

단일 문에서 여러 DML(INSERT, UPDATE, DELETE) 작업을 수행할 수 있다.

 

즉, 여러 개의 개별 DML문을 단일 문으로 대체할 수 있다.

 

작업이 하나의 문 내에서 수행되면서, 데이터가 처리되는 횟수가 최소화되고 쿼리 성능이 향상된다.

 

 

 

MERGE는 다음과 같이 사용한다.

 

 

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

 

 

아래와 같이 기준테이블의 컬럼을 지정할 수 있다.

 

또한, MATCHED, NOT MATCHED와 함께 추가 조건 지정도 가능하다.

 

 

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;
 

 

 

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

 

예제

CREATE TABLE #TEMP_A ( 
  분류 VARCHAR(20),
  제품 VARCHAR(20),
  가격 INT
)
GO
INSERT INTO #TEMP_A VALUES
('음식', '우유', 4000),
('음식', '딸기', 5000),
('학용품', '연필', 3000),
('의류', '티셔츠', 10000),
('의류', '반바지', 25000)
GO
CREATE TABLE #TEMP_B
( 
  사유 VARCHAR(20),
  분류 VARCHAR(20),
  제품 VARCHAR(20),
  가격 INT
)
GO
INSERT INTO #TEMP_B VALUES
('상함', '음식', '딸기', 5000),
('새제품', '학용품', '지우개', 1000),
('손상', '의류', '티셔츠', 10000),
('손상', '의류', '반바지', 25000)
 
SELECT * FROM #TEMP_A
SELECT * FROM #TEMP_B

 

 

원본 데이터

 

 

1. 분류와 제품 컬럼을 기준으로 #TEMP_B와 #TEMP_A에 동일한 값이 존재하지 않고,

#TEMP_B에서 사유컬럼의 값이 '새제품'이라면

해당 데이터를 #TEMP_A에 INSERT한다.

 

2. 분류와 제품 컬럼을 기준으로 #TEMP_B와 #TEMP_A에 동일한 값이 존재하고,

#TEMP_B에서 사유컬럼의 값이 '손상' 이라면

해당하는 #TEMP_A의 데이터에서 제품명을 '수선한' + 기존 제품명으로 UPDATE한다.

 

3. 분류와 제품 컬럼을 기준으로 #TEMP_B와 #TEMP_A에 동일한 값이 존재하고,

#TEMP_B에서 사유컬럼의 값이 '상함' 이라면

#TEMP_A의 해당 데이터를 DELETE한다.

 

 

-- 1. 새제품 INSERT
INSERT INTO #TEMP_A
SELECT B.분류, B.제품, B.가격
FROM #TEMP_A A
    RIGHT JOIN #TEMP_B B ON A.분류 = B.분류 AND A.제품 = B.제품
WHERE A.분류 IS NULL
    AND B.사유 = '새제품'
 
-- 2. 손상 제품 UPDATE
UPDATE #TEMP_A SET 제품 = '수선한 ' + A.제품
FROM #TEMP_A A
INNER JOIN
(
    SELECT B.분류, B.제품, B.가격
    FROM #TEMP_A A
        RIGHT JOIN #TEMP_B B ON A.분류 = B.분류 AND A.제품 = B.제품
    WHERE A.분류 IS NOT NULL
        AND B.사유 = '손상'
) B ON A.분류 = B.분류 AND A.제품 = B.제품 AND A.가격 = B.가격
 
-- 3. 상한 제품 DELETE
DELETE #TEMP_A FROM #TEMP_A A
INNER JOIN
(
    SELECT B.분류, B.제품, B.가격
    FROM #TEMP_A A
        RIGHT JOIN #TEMP_B B ON A.분류 = B.분류 AND A.제품 = B.제품
    WHERE A.분류 IS NOT NULL
        AND B.사유 = '상함'
) B ON A.분류 = B.분류 AND A.제품 = B.제품 AND A.가격 = B.가격
 
각각 INSERT, UPDATE, DELETE 세개의 쿼리문을 각각 작성해보았다.
 
 
자 그럼 이제 이 3개의 쿼리를 MERGE를 사용하여 간단하게 다시 작성해보자
 
MERGE #TEMP_A AS A
 
    -- 분류와 제품컬럼을 기준으로 비교
    USING (SELECT 사유, 분류, 제품, 가격 FROM #TEMP_B) AS B
    ON (A.분류 = B.분류 AND A.제품 = B.제품)
    
    -- 1. 분류컬럼과 제품컬럼의 값이 일치한 행이 존재하지 않고, 해당 행의 사유컬럼의 값이 '새제품'일 경우
    WHEN NOT MATCHED AND B.사유 = '새제품' THEN
        INSERT (분류, 제품, 가격) VALUES (B.분류, B.제품, B.가격)
    
    -- 2. 분류컬럼과 제품컬럼의 값이 일치한 행이 존재하고, 해당 행의 사유컬럼의 값이 '손상'일 경우
    WHEN MATCHED AND B.사유 = '손상' THEN
        UPDATE SET 제품 = ('수선한 ' + B.제품)
 
    -- 3. 분류컬럼과 제품컬럼의 값이 일치한 행이 존재하고, 해당 행의 사유컬럼의 값이 '상함'일 경우
    WHEN MATCHED AND B.사유 = '상함' THEN
        DELETE;

 

#TEMP_A 결과

 



출처: https://ggmouse.tistory.com/130 [초보개발자꽁쥐]

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86312
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 78768
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95517
27 [DB modeling, DB 모델링] [DB] DB 설계 과정 file 졸리운_곰 2025.03.10 1542
26 [DB modeling, DB 모델링] [DATABASE] 기본키(PK), 외래키(FK) file 졸리운_곰 2025.01.29 1903
25 [DB modeling, DB 모델링] 바쁜 데이터 전문가를 위한 7가지 무료 데이터베이스 다이어그래밍 도구 : 7 free database diagramming tools for busy data folks file 졸리운_곰 2025.01.19 1035
24 [DB modeling, DB 모델링] ERD 다이어그램 그리는 방법 file 졸리운_곰 2024.10.29 1405
23 [데이터베이스 모델링] 정규화와 응집도에 대한 고찰 file 졸리운_곰 2024.08.10 1734
22 [데이터베이스 모델링] [SQL] 데이터베이스 관계(Relationship) 기본 (1:1, 1:N, N:N 테이블 생성 예시 포함) file 졸리운_곰 2024.07.12 2101
21 [데이터베이스 모델링] 테이블정의양식 file 졸리운_곰 2024.02.23 1228
20 [데이터베이스 모델링] DAsP - 물리 데이터 모델링 [논리-물리 모델 변환] file 졸리운_곰 2022.05.07 1897
19 [데이터베이스 모델링] 관계형 데이터 모델링 하향식과 상향식 졸리운_곰 2022.05.07 1793
18 [데이터베이스 모델링] 모델링 IE 표기법 (까치발, 까마귀발, crow-feet) file 졸리운_곰 2022.04.26 2158
17 설문 조사를위한 데이터베이스 설계 file 졸리운_곰 2020.09.05 5725
16 [dbguide] 프로세스모델링 작성 절차 (데이터베이스 시스템분석설계 프로세스 모델링) file 졸리운_곰 2020.07.27 1774
15 [dbguide] 데이터모델링 작성 절차 (데이터베이스 모델링 절차) file 졸리운_곰 2020.07.27 1780
14 데이터 품질진단 절차 및 기법 file 졸리운_곰 2020.07.26 2056
13 [번역] 데이터 구조와 설계 — 튜토리얼 file 졸리운_곰 2020.07.26 1809
12 EA( Enterprise Architecture) 전사 아키텍처 file 졸리운_곰 2020.07.25 1785
11 데이터품질관리지침Ver[1].2.1.pdf file 졸리운_곰 2020.07.25 1846
10 테이블 설계의 기초 졸리운_곰 2020.07.25 2124
9 데이터베이스 디자인의 기초 file 졸리운_곰 2020.07.25 1683
8 Enterprise Data Model for Logistics file 졸리운_곰 2019.06.16 1265
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED