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
'Study > SQL.' 카테고리의 다른 글
[Oracle] 최근 변경 데이터 조회(Timestamp) (0) | 2024.01.17 |
---|---|
프로그래머스 SQL Lv.1 최댓값 구하기 (0) | 2022.07.11 |
프로그래머스 SQL Lv.1모든레코드 조회하기 (0) | 2022.07.11 |
Oracle DB, MySql 구문차이 (0) | 2021.09.08 |
오라클 에러 ORA-00997, ORA-00932 (0) | 2021.09.07 |