Study/SQL.

쓸때마다 찾아봐서 결국 적어놓는 쿼리

의미없는 시간은 없다. 2021. 7. 28. 15:41

1. MERGE

- 있으면 UPDATE 없으면 INSERT

- 방법은 하기 나름이지만 PL/SQL사용시

BEGIN
        UPDATE TABLE_NAME
             SET NAME = '철수' ,AGE = '20'
        WHERE  NAME = '철수' AND AGE = '20'
IF SQL%NOTFOUND THEN 
        INSERT INTO TABLE_NAME(NAME,AGE) VALUES( '철수', '20');
END IF;
END; --세미콜론 꼭꼭 확인

 

- 오라클에서 제공하는 merge

1)본인테이블에 있는지 확인하고 입력할 때

MERGE INTO TMP_PKM_01 A
    USING DUAL --DUAL본인테이블일 때
       ON ( A.DATA1='53') --DATA1에 53이라는게 있는지 조건입력
    WHEN MATCHED THEN --위의 조건이 있으면 업데이트
        UPDATE SET A.DATA2 ='테스트'
    WHEN NOT MATCHED THEN -- 없으면 인서트( 반대로도 가능)
        INSERT (DATA1,DATA2) 
        VALUES ('53','테스트1')

2)다른테이블 데이터를 변경할 때

MERGE INTO TMP_PKM_01 A
    USING TMP_PKM_02 B --DUAL본인테이블일때
       ON ( A.DATA1 = B.DATA1) --A,B테이블에 같은값이 있으면(PK로 주로 조인을 많이하겠지)
    WHEN MATCHED THEN --위의 조건이 있으면 업데이트
        UPDATE SET B.DATA2 ='테스트'
    WHEN NOT MATCHED THEN -- 없으면 인서트( 반대로도 가능)
        INSERT (B.DATA1,B.DATA2) 
        VALUES ('53','테스트1')

3) MySQL에서 Merge(DUPLICATE KEY)

INSERT INTO TMP_PKM_02(DATA1, DATA2) VALUES('53', '테스트1') ON DUPLICATE KEY UPDATE NAME = '테스트';

 

※ORA-38104 : ON 절에서 참조되는 열은 갱신할 수 없음.

-본인테이블을 비교하고 값을 수정하거나 삽입할 때 , 발생.

==> 2)USING에 DUAL을 쓰고 ON의 조건을 변경

--------------------------------------------------------------------------------------------------------------------------

2. 소계(ROLLUP, WITH ROLLUP)

-기존작업시에는 기존데이터 + 소계를 낸 데이터를 UNION ALL 로 붙이고 각 데이터에 정렬값을 줘서 재조회 하는방식으로 했는데 엄청 간단한 방법이 있었다

--DATA2에 대한 소계를 구해줌

1)오라클

SELECT DATA1,DATA2 ,SUM(DATA2) FROM TMP_PKM_01 GROUP BY ROLLUP(DATA1,DATA2);

2)MySQL

SELECT DATA1,DATA2 ,SUM(DATA2) FROM TMP_PKM_01 GROUP BY DATA1,DATA2 WITH ROLLUP

 

반응형