(Oracle DB) - 18. MERGE

kynoh·2023년 3월 26일
0

Oracle Database

목록 보기
22/30
/* MERGE 
	#	Condition 비교
		- Data의 condition result == 'false' in the Table
			* INSERT the data
		- Data의 condition result == 'true' in the table
			* UPDATE the data
*/


/* Format of MERGE */
MERGE INTO table_name
	USING (subquery / table)	-- Source data for UPDATE / INSERT
		ON	(condition)	-- Condition to join the source & destination tables : Define how the rows should be matched between source & destination tables
WHEN MATCHED THEN
	UPDATE
		SET(
			column1 = value,
			column2 = value,
			...)
	WHERE / DELETE WHERE	-- WHERE works in case of UPDATE / DELETE WHERE works in case of DELETE
		(condition)			-- Condition for UPDATE
WHEN NOT MATCHED THEN
	INSERT					-- INTO has been written next to MERGE
		(column1, column2, ...)
		VALUES
		(value, value, ...)
	WHERE
		(condition)			-- Condition for INSERT
;


---------------------------------------------------- Practice of MERGE with Two Tables -------------------------
/*
	#	Step 1. 먼저 merge용도의 table을 CREATE
	#	Step 2. 조건에 맞는 data가 있으면 UPDATE하고, 없다면 INSERT
*/

CREATE TABLE ex3_3 (
	employee_id    NUMBER,
	additional_bonus NUMBER DEFAULT 0
);

	/* Milestone of MERGE
	
		#	sales table에서, 2000년 10월 ~ 12월까지 매출 달성한 사원의 employee_id를 조회
			-	해당 employee_id를 INSERT INTO ex3_3
				*	GROUP BY로 duplicated data를 방지
				
		#	employees table에서, manager_id가 146번인 사원(x)을 조회
			-	x의 employee_id가, ex3_3 table에 insert된 사원과 일치한다면,
				additional_bonus에 salary의 5%를 bonus로 UPDATE
			-	일치하지 않는다면, x를 ex3_3 table에 INSERT해주고,
				x의 salary가 8000 미만인 경우 additional_bonus (5% of salary)
	*/


	/*
		sales table에서, 2000년 10월 ~ 12월까지 매출 달성한 사원의 employee_id를 조회,
		manager_id를 활용할 것이므로 employees table과 join
	*/
SELECT s.employee_id
	FROM sales s, employees e
WHERE 1 = 1
AND s.employee_id = e.employee_id
AND s.sales_month
	BETWEEN '200010' AND '200012'

;	-- 55,984


	/*
		해당 employee_id를 INSERT INTO ex3_3 
		GROUP BY로 duplicated data를 방지
	*/
INSERT INTO ex3_3
	(employee_id)
	(
	SELECT s.employee_id
		FROM sales s, employees e
	WHERE 1 = 1
	AND s.employee_id = e.employee_id
	AND s.sales_month
		BETWEEN '200010' AND '200012'
	GROUP BY s.employee_id
	)
;	-- 5 rows inserted.

	/* INSERT된 employee_id를 조회 */
SELECT *
	FROM ex3_3
ORDER BY employee_id
;


	/*
		#	UPDATE 대상을 조회
		employees table에서, manager_id가 146번이면서
		employee_id가 ex3_3 table에 insert된 사원과 일치하는 사원(x)을 조회
		(additional_bonus가 salary의 5%)
	*/
SELECT
	employee_id,
	manager_id,
	salary,
	salary * 0.05
		AS additional_bonus
	FROM employees
WHERE 1 = 1
AND manager_id = 146
AND employee_id
	IN (SELECT employee_id FROM ex3_3)
;	-- 1 명


	/*
		#	INSERT 대상을 조회
		employees table에서, manager_id가 146번이면서
		employee_id가 ex3_3 table에 insert된 사원과 일치하지 않는 사원(Y)을 조회
		(Y의 salary가 8000 미만인 경우, additional_bonus가 salary의 2%)
	*/
SELECT
	employee_id,
	manager_id,
	salary,
	salary * 0.02
		AS additional_bonus
	FROM employees
WHERE 1 = 1
AND manager_id = 146
AND salary < 8000
AND employee_id
	NOT IN (SELECT employee_id FROM ex3_3)
;


	-- MERGE
MERGE INTO ex3_3 ex
	USING
		(
		SELECT
			emp.employee_id, emp.manager_id,
			emp.salary
			FROM employees emp
		WHERE emp.manager_id = 146
		) proc
	ON (ex.employee_id = proc.employee_id)
WHEN MATCHED THEN
	UPDATE
		SET ex.additional_bonus = proc.salary * 0.05	
WHEN NOT MATCHED THEN
	INSERT
		VALUES
		(proc.employee_id, proc.salary * 0.01)
	WHERE 1 = 1
	AND proc.salary < 8000
;


/* MERGE - DELETE WHERE */
MERGE INTO ex3_3 ex
	USING
		(
		SELECT
			emp.employee_id, emp.manager_id,
			emp.salary
			FROM employees emp
		WHERE emp.manager_id = 146
		) proc
	ON (ex.employee_id = proc.employee_id)
WHEN MATCHED THEN
	UPDATE
		SET ex.additional_bonus = proc.salary * 0.05
	DELETE WHERE
		ex.employee_id = 161
WHEN NOT MATCHED THEN
	INSERT
		VALUES
		(proc.employee_id, proc.salary * 0.01)
	WHERE 1 = 1
	AND proc.salary < 8000
;


SELECT *
	FROM ex3_3
ORDER BY employee_id
;
profile
On-orbit

1개의 댓글

comment-user-thumbnail
약 2시간 전

I’m prompted while using the surpassing in addition to preachy checklist you give in such very little timing.송파 룸싸롱

답글 달기

관련 채용 정보