Note: Primarily of value when moving large amounts of data in data warehouse situations. | | Merge Statement Demo | MERGE <hint> INTO <table_name> USING <table_view_or_query> ON (<condition>) WHEN MATCHED THEN <update_clause> WHEN NOT MATCHED THEN <insert_clause>; | CREATE TABLE employee ( employee_id NUMBER(5), first_name VARCHAR2(20), last_name VARCHAR2(20), dept_no NUMBER(2), salary NUMBER(10));
INSERT INTO employee VALUES (1, 'Dan', 'Morgan', 10, 100000); INSERT INTO employee VALUES (2, 'Jack', 'Cline', 20, 100000); INSERT INTO employee VALUES (3, 'Elizabeth', 'Scott', 20, 50000); INSERT INTO employee VALUES (4, 'Jackie', 'Stough', 20, 40000); INSERT INTO employee VALUES (5, 'Richard', 'Foote', 20, 30000); INSERT INTO employee VALUES (6, 'Joe', 'Johnson', 20, 70000); INSERT INTO employee VALUES (7, 'Clark', 'Urling', 20, 90000); COMMIT;
CREATE TABLE bonuses ( employee_id NUMBER, bonus NUMBER DEFAULT 100);
INSERT INTO bonuses (employee_id) VALUES (1); INSERT INTO bonuses (employee_id) VALUES (2); INSERT INTO bonuses (employee_id) VALUES (4); INSERT INTO bonuses (employee_id) VALUES (6); INSERT INTO bonuses (employee_id) VALUES (7); COMMIT;
MERGE INTO bonuses B USING ( SELECT employee_id, salary FROM employee WHERE dept_no =20) E ON (B.employee_id = E.employee_id) WHEN MATCHED THEN UPDATE SET B.bonus = E.salary * 0.1 WHEN NOT MATCHED THEN INSERT (B.employee_id, B.bonus) VALUES (E.employee_id, E.salary * 0.05); |
|