fbpx


USE HR
GO

DROP TABLE emp_source ;
GO

DROP TABLE emp_destination ;
GO

DROP TABLE merge_log
GO

SELECT TOP 20 employee_id , last_name , salary , department_id
INTO emp_source
FROM employees 

SELECT  TOP 10 employee_id , last_name , 2000 AS SALARY, department_id
INTO emp_destination
FROM employees 

CREATE TABLE merge_log
	(	dml_action varchar(25) ,
		dml_date   datetime,
		employee_id int,
		last_name varchar(25),
		salary int,
		department_id int)

SELECT * FROM emp_source 

SELECT * FROM emp_destination ;

SELECT * FROM merge_log

---------------------------------------------------------------------
-- Merge Option 1
---------------------------------------------------------------------

MERGE INTO emp_destination dest USING emp_source src
ON (dest.employee_id = src.employee_id )
WHEN MATCHED THEN
				UPDATE SET dest.salary = src.salary ,
	           dest.department_id = src.department_id
WHEN NOT MATCHED THEN
				INSERT
				VALUES (src.employee_id , src.last_name , src.salary , src.department_id)
OUTPUT  $action, getdate(), inserted.employee_id ,inserted.last_name , inserted.salary ,
				inserted.department_id
INTO       merge_log ;

SELECT * FROM emp_source 

SELECT * FROM emp_destination ;

SELECT * FROM merge_log

---------------------------------------------------------------------
-- Merge Option 2
---------------------------------------------------------------------

DELETE FROM emp_source WHERE employee_id > 117 

UPDATE emp_source SET salary = salary + 20

MERGE INTO emp_destination dest USING emp_source src
ON (dest.employee_id = src.employee_id )
WHEN MATCHED THEN
				UPDATE SET dest.salary = src.salary ,
	           dest.department_id = src.department_id
WHEN NOT MATCHED BY SOURCE THEN
				DELETE
OUTPUT  $action, getdate(), deleted.employee_id ,deleted.last_name , deleted.salary ,
				deleted.department_id
INTO       merge_log ;

SELECT * FROM emp_source 

SELECT * FROM emp_destination ;

SELECT * FROM merge_log

---------------------------------------------------------------------
-- Merge Option 3
---------------------------------------------------------------------

DELETE FROM emp_source WHERE employee_id > 110 

UPDATE emp_source SET salary = salary + 20

MERGE INTO emp_destination dest USING emp_source src
ON (dest.employee_id = src.employee_id )
WHEN MATCHED THEN
				UPDATE SET dest.salary = src.salary ,
	           dest.department_id = src.department_id
WHEN NOT MATCHED BY SOURCE THEN
				DELETE
OUTPUT  $action, getdate(),
				CASE $action
				WHEN 'UPDATE' THEN inserted.employee_id ELSE  deleted.employee_id END ,
				CASE $action
				WHEN 'UPDATE' THEN inserted.last_name ELSE  deleted.last_name END ,
				CASE $action
				WHEN 'UPDATE' THEN inserted.salary ELSE  deleted.salary END ,
				CASE $action
				WHEN 'UPDATE' THEN inserted.department_id ELSE  deleted.department_id END
INTO       merge_log ;

SELECT * FROM emp_source 

SELECT * FROM emp_destination ;

SELECT * FROM merge_log