Oracle高級語法篇之merge?into語句復(fù)雜案例
前言
在數(shù)據(jù)處理和數(shù)據(jù)庫操作中,我們常常會遇到需要將兩個數(shù)據(jù)集進行合并,并根據(jù)匹配情況執(zhí)行不同操作的場景。Oracle 數(shù)據(jù)庫中的 MERGE INTO
語句正是為這種需求而設(shè)計的。
一、代碼模板
MERGE INTO
語句的基本語法結(jié)構(gòu)如下:
MERGE INTO 目標(biāo)表名 t USING 源表名 s ON (條件表達式) WHEN MATCHED THEN UPDATE SET t.列名1 = s.列名1 [, t.列名2 = s.列名2 ...] [WHERE 條件表達式] WHEN NOT MATCHED THEN INSERT (t.列名1 [, t.列名2 ...]) VALUES (s.列名1 [, s.列名2 ...]) [WHERE 條件表達式];
MERGE INTO
:指定要合并的目標(biāo)表。USING
:指定源表或子查詢。ON
:指定目標(biāo)表和源表之間的匹配條件。WHEN MATCHED THEN
:當(dāng)目標(biāo)表和源表中的記錄匹配時,執(zhí)行更新操作。WHEN NOT MATCHED THEN
:當(dāng)目標(biāo)表中沒有與源表匹配的記錄時,執(zhí)行插入操作。
二、使用場景
MERGE INTO
語句適用于以下場景:
1. 數(shù)據(jù)整合
當(dāng)需要將兩個表的數(shù)據(jù)進行整合時,MERGE INTO
可以根據(jù)匹配條件,將源表中的數(shù)據(jù)更新到目標(biāo)表中,或者將不匹配的數(shù)據(jù)插入到目標(biāo)表中。
2. 數(shù)據(jù)同步
在數(shù)據(jù)倉庫或數(shù)據(jù)同步場景中,MERGE INTO
可以用來同步兩個數(shù)據(jù)源。例如,將生產(chǎn)數(shù)據(jù)庫中的數(shù)據(jù)同步到數(shù)據(jù)倉庫中,同時更新已存在的記錄。
3. 數(shù)據(jù)初始化
在初始化數(shù)據(jù)時,如果目標(biāo)表中已經(jīng)存在部分數(shù)據(jù),可以使用 MERGE INTO
來避免重復(fù)插入,同時更新已存在的數(shù)據(jù)。
三、復(fù)雜案例
案例 1:多表關(guān)聯(lián)更新與插入
假設(shè)我們有以下三個表:employees
、departments
和 new_employees_departments
。new_employees_departments
表中存儲了新的員工及其部門信息。我們需要將這些新數(shù)據(jù)同步到 employees
和 departments
表中。如果員工已存在,則更新其信息;如果部門已存在,則更新部門信息;如果員工或部門不存在,則插入新記錄。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 創(chuàng)建部門表 CREATE TABLE departments ( department_id NUMBER(4) PRIMARY KEY, department_name VARCHAR2(30) NOT NULL, manager_id NUMBER(6), location_id NUMBER(4) ); -- 創(chuàng)建新員工部門表 CREATE TABLE new_employees_departments ( employee_id NUMBER(6), name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), department_name VARCHAR2(30) NOT NULL, location_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10); INSERT INTO departments (department_id, department_name, manager_id, location_id) VALUES (10, 'IT', 101, 1001); INSERT INTO new_employees_departments (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10, 'Information Technology', 1001); INSERT INTO new_employees_departments (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20, 'Sales', 1002); -- 使用 MERGE INTO 同步員工和部門信息 MERGE INTO employees e USING ( SELECT ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, ned.manager_id, ned.department_id, ned.department_name, ned.location_id FROM new_employees_departments ned ) ned ON (e.employee_id = ned.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ned.email, e.salary = ned.salary WHERE e.salary <> ned.salary OR e.email <> ned.email WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, ned.manager_id, ned.department_id); -- 使用 MERGE INTO 同步部門信息 MERGE INTO departments d USING ( SELECT ned.department_id, ned.department_name, ned.location_id FROM new_employees_departments ned ) ned ON (d.department_id = ned.department_id) WHEN MATCHED THEN UPDATE SET d.department_name = ned.department_name, d.location_id = ned.location_id WHERE d.department_name <> ned.department_name OR d.location_id <> ned.location_id WHEN NOT MATCHED THEN INSERT (department_id, department_name, location_id) VALUES (ned.department_id, ned.department_name, ned.location_id); -- 查詢合并后的結(jié)果 SELECT * FROM employees; SELECT * FROM departments;
案例 2:使用子查詢作為源數(shù)據(jù)
假設(shè)我們有 employees
表和 employee_updates
表。employee_updates
表中存儲了員工的更新信息,但這些信息需要經(jīng)過一定的處理才能應(yīng)用到 employees
表中。我們需要根據(jù) employee_updates
表中的數(shù)據(jù)更新 employees
表,如果員工不存在,則插入新記錄。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 創(chuàng)建員工更新表 CREATE TABLE employee_updates ( update_id NUMBER(6) PRIMARY KEY, employee_id NUMBER(6), new_name VARCHAR2(50), new_email VARCHAR2(50), new_salary NUMBER(8,2), update_date DATE ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10); INSERT INTO employee_updates (update_id, employee_id, new_name, new_email, new_salary, update_date) VALUES (1, 100, 'Alice Smith', 'alice.smith@example.com', 5500, SYSDATE); INSERT INTO employee_updates (update_id, employee_id, new_name, new_email, new_salary, update_date) VALUES (2, 101, 'Bob Johnson', 'bob.johnson@example.com', 6000, SYSDATE); -- 使用 MERGE INTO 和子查詢更新員工信息 MERGE INTO employees e USING ( SELECT eu.employee_id, eu.new_name, eu.new_email, eu.new_salary, eu.update_date FROM employee_updates eu WHERE eu.update_date = ( SELECT MAX(update_date) FROM employee_updates WHERE employee_id = eu.employee_id ) ) eu ON (e.employee_id = eu.employee_id) WHEN MATCHED THEN UPDATE SET e.name = eu.new_name, e.email = eu.new_email, e.salary = eu.new_salary WHERE e.name <> eu.new_name OR e.email <> eu.new_email OR e.salary <> eu.new_salary WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (eu.employee_id, eu.new_name, eu.new_email, '555-5678', SYSDATE, 'SA_REP', eu.new_salary, 0.2, 102, 20); -- 查詢合并后的結(jié)果 SELECT * FROM employees;
案例 3:條件判斷更新與插入
假設(shè)我們有 employees
表和 new_employees
表。new_employees
表中存儲了新的員工信息,但我們需要根據(jù)一定的條件來決定是否更新或插入記錄。例如,只有當(dāng)新員工的工資高于目標(biāo)表中現(xiàn)有員工的工資時,才進行更新;如果員工不存在,則插入新記錄。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 創(chuàng)建新員工表 CREATE TABLE new_employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10); INSERT INTO new_employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10); INSERT INTO new_employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20); -- 使用 MERGE INTO 和條件判斷更新員工信息 MERGE INTO employees e USING new_employees ne ON (e.employee_id = ne.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ne.email, e.salary = ne.salary WHERE ne.salary > e.salary OR e.email <> ne.email WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (ne.employee_id, ne.name, ne.email, ne.phone_number, ne.hire_date, ne.job_id, ne.salary, ne.commission_pct, ne.manager_id, ne.department_id); -- 查詢合并后的結(jié)果 SELECT * FROM employees;
案例 4:跨表更新與插入
假設(shè)我們有 employees
表、departments
表和 new_employee_department
表。new_employee_department
表中存儲了新的員工及其部門信息。我們需要將這些新數(shù)據(jù)同步到 employees
和 departments
表中。如果員工已存在,則更新其信息;如果部門已存在,則更新部門信息;如果員工或部門不存在,則插入新記錄。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 創(chuàng)建部門表 CREATE TABLE departments ( department_id NUMBER(4) PRIMARY KEY, department_name VARCHAR2(30) NOT NULL, manager_id NUMBER(6), location_id NUMBER(4) ); -- 創(chuàng)建新員工部門表 CREATE TABLE new_employee_department ( employee_id NUMBER(6), name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), department_name VARCHAR2(30) NOT NULL, location_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10); INSERT INTO departments (department_id, department_name, manager_id, location_id) VALUES (10, 'IT', 101, 1001); INSERT INTO new_employee_department (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10, 'Information Technology', 1001); INSERT INTO new_employee_department (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20, 'Sales', 1002); -- 使用 MERGE INTO 同步員工信息 MERGE INTO employees e USING ( SELECT ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, ned.manager_id, ned.department_id FROM new_employee_department ned ) ned ON (e.employee_id = ned.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ned.email, e.salary = ned.salary WHERE e.salary <> ned.salary OR e.email <> ned.email WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, ned.manager_id, ned.department_id); -- 使用 MERGE INTO 同步部門信息 MERGE INTO departments d USING ( SELECT ned.department_id, ned.department_name, ned.location_id FROM new_employee_department ned ) ned ON (d.department_id = ned.department_id) WHEN MATCHED THEN UPDATE SET d.department_name = ned.department_name, d.location_id = ned.location_id WHERE d.department_name <> ned.department_name OR d.location_id <> ned.location_id WHEN NOT MATCHED THEN INSERT (department_id, department_name, location_id) VALUES (ned.department_id, ned.department_name, ned.location_id); -- 查詢合并后的結(jié)果 SELECT * FROM employees; SELECT * FROM departments;
案例 5:使用聚合函數(shù)和條件判斷
假設(shè)我們有 employees
表和 employee_salaries
表。employee_salaries
表中存儲了員工的多次工資調(diào)整記錄。我們需要根據(jù)最新的工資調(diào)整記錄更新 employees
表中的工資信息。如果員工不存在,則插入新記錄。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 創(chuàng)建員工工資調(diào)整表 CREATE TABLE employee_salaries ( salary_id NUMBER(6) PRIMARY KEY, employee_id NUMBER(6), new_salary NUMBER(8,2), effective_date DATE ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10); INSERT INTO employee_salaries (salary_id, employee_id, new_salary, effective_date) VALUES (1, 100, 5500, SYSDATE - 10); INSERT INTO employee_salaries (salary_id, employee_id, new_salary, effective_date) VALUES (2, 100, 5800, SYSDATE - 5); INSERT INTO employee_salaries (salary_id, employee_id, new_salary, effective_date) VALUES (3, 101, 6000, SYSDATE); -- 使用 MERGE INTO 和聚合函數(shù)更新員工工資信息 MERGE INTO employees e USING ( SELECT es.employee_id, MAX(es.new_salary) AS latest_salary FROM employee_salaries es WHERE es.effective_date = ( SELECT MAX(effective_date) FROM employee_salaries WHERE employee_id = es.employee_id ) GROUP BY es.employee_id ) es ON (e.employee_id = es.employee_id) WHEN MATCHED THEN UPDATE SET e.salary = es.latest_salary WHERE e.salary <> es.latest_salary WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (es.employee_id, 'New Employee', 'new@example.com', '555-5678', SYSDATE, 'SA_REP', es.latest_salary, 0.2, 102, 20); -- 查詢合并后的結(jié)果 SELECT * FROM employees;
案例 6:多條件匹配更新與插入
假設(shè)我們有 employees
表和 new_employees
表。new_employees
表中存儲了新的員工信息,但我們需要根據(jù)多個條件來決定是否更新或插入記錄。例如,只有當(dāng)新員工的工資高于目標(biāo)表中現(xiàn)有員工的工資且電子郵件不同時,才進行更新;如果員工不存在,則插入新記錄。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 創(chuàng)建新員工表 CREATE TABLE new_employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10); INSERT INTO new_employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10); INSERT INTO new_employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20); -- 使用 MERGE INTO 和多條件判斷更新員工信息 MERGE INTO employees e USING new_employees ne ON (e.employee_id = ne.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ne.email, e.salary = ne.salary WHERE ne.salary > e.salary AND e.email <> ne.email WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (ne.employee_id, ne.name, ne.email, ne.phone_number, ne.hire_date, ne.job_id, ne.salary, ne.commission_pct, ne.manager_id, ne.department_id); -- 查詢合并后的結(jié)果 SELECT * FROM employees;
案例 7:使用子查詢和聚合函數(shù)
假設(shè)我們有 employees
表和 employee_performance
表。employee_performance
表中存儲了員工的績效評分記錄。我們需要根據(jù)員工的平均績效評分來更新 employees
表中的績效獎金比例。如果員工不存在,則插入新記錄。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), performance_bonus NUMBER(2,2) ); -- 創(chuàng)建員工績效表 CREATE TABLE employee_performance ( performance_id NUMBER(6) PRIMARY KEY, employee_id NUMBER(6), performance_score NUMBER(3), evaluation_date DATE ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10, 0.05); INSERT INTO employee_performance (performance_id, employee_id, performance_score, evaluation_date) VALUES (1, 100, 90, SYSDATE - 30); INSERT INTO employee_performance (performance_id, employee_id, performance_score, evaluation_date) VALUES (2, 100, 95, SYSDATE - 15); INSERT INTO employee_performance (performance_id, employee_id, performance_score, evaluation_date) VALUES (3, 101, 85, SYSDATE - 10); -- 使用 MERGE INTO 和子查詢更新員工績效獎金 MERGE INTO employees e USING ( SELECT ep.employee_id, AVG(ep.performance_score) AS avg_performance_score FROM employee_performance ep GROUP BY ep.employee_id ) ep ON (e.employee_id = ep.employee_id) WHEN MATCHED THEN UPDATE SET e.performance_bonus = CASE WHEN ep.avg_performance_score >= 90 THEN 0.1 WHEN ep.avg_performance_score BETWEEN 80 AND 89 THEN 0.07 WHEN ep.avg_performance_score BETWEEN 70 AND 79 THEN 0.05 ELSE 0.03 END WHERE e.performance_bonus <> ( CASE WHEN ep.avg_performance_score >= 90 THEN 0.1 WHEN ep.avg_performance_score BETWEEN 80 AND 89 THEN 0.07 WHEN ep.avg_performance_score BETWEEN 70 AND 79 THEN 0.05 ELSE 0.03 END ) WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (ep.employee_id, 'New Employee', 'new@example.com', '555-5678', SYSDATE, 'SA_REP', 6000, 0.2, 102, 20, CASE WHEN ep.avg_performance_score >= 90 THEN 0.1 WHEN ep.avg_performance_score BETWEEN 80 AND 89 THEN 0.07 WHEN ep.avg_performance_score BETWEEN 70 AND 79 THEN 0.05 ELSE 0.03 END); -- 查詢合并后的結(jié)果 SELECT * FROM employees;
案例 8:跨表更新與條件判斷
假設(shè)我們有 employees
表、departments
表和 new_employee_department
表。new_employee_department
表中存儲了新的員工及其部門信息。我們需要將這些新數(shù)據(jù)同步到 employees
和 departments
表中。如果員工已存在,則更新其信息;如果部門已存在,則更新部門信息;如果員工或部門不存在,則插入新記錄。同時,我們還需要根據(jù)員工的工資和部門的地點來決定是否更新或插入記錄。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 創(chuàng)建部門表 CREATE TABLE departments ( department_id NUMBER(4) PRIMARY KEY, department_name VARCHAR2(30) NOT NULL, manager_id NUMBER(6), location_id NUMBER(4) ); -- 創(chuàng)建新員工部門表 CREATE TABLE new_employee_department ( employee_id NUMBER(6), name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), department_name VARCHAR2(30) NOT NULL, location_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10); INSERT INTO departments (department_id, department_name, manager_id, location_id) VALUES (10, 'IT', 101, 1001); INSERT INTO new_employee_department (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10, 'Information Technology', 1001); INSERT INTO new_employee_department (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20, 'Sales', 1002); -- 使用 MERGE INTO 和條件判斷更新員工信息 MERGE INTO employees e USING ( SELECT ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, ned.manager_id, ned.department_id, ned.department_name, ned.location_id FROM new_employee_department ned ) ned ON (e.employee_id = ned.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ned.email, e.salary = ned.salary WHERE (e.salary <> ned.salary AND ned.salary > 5000) OR (e.email <> ned.email AND ned.location_id = 1001) WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, ned.manager_id, ned.department_id); -- 使用 MERGE INTO 和條件判斷更新部門信息 MERGE INTO departments d USING ( SELECT ned.department_id, ned.department_name, ned.location_id FROM new_employee_department ned ) ned ON (d.department_id = ned.department_id) WHEN MATCHED THEN UPDATE SET d.department_name = ned.department_name, d.location_id = ned.location_id WHERE (d.department_name <> ned.department_name AND ned.location_id = 1001) OR (d.location_id <> ned.location_id AND ned.salary > 5000) WHEN NOT MATCHED THEN INSERT (department_id, department_name, location_id) VALUES (ned.department_id, ned.department_name, ned.location_id); -- 查詢合并后的結(jié)果 SELECT * FROM employees; SELECT * FROM departments;
案例 9:使用子查詢和多表關(guān)聯(lián)
假設(shè)我們有 employees
表、departments
表和 new_employee_department
表。new_employee_department
表中存儲了新的員工及其部門信息。我們需要將這些新數(shù)據(jù)同步到 employees
和 departments
表中。如果員工已存在,則更新其信息;如果部門已存在,則更新部門信息;如果員工或部門不存在,則插入新記錄。同時,我們還需要根據(jù)員工的工資和部門的地點來決定是否更新或插入記錄。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 創(chuàng)建部門表 CREATE TABLE departments ( department_id NUMBER(4) PRIMARY KEY, department_name VARCHAR2(30) NOT NULL, manager_id NUMBER(6), location_id NUMBER(4) ); -- 創(chuàng)建新員工部門表 CREATE TABLE new_employee_department ( employee_id NUMBER(6), name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), department_name VARCHAR2(30) NOT NULL, location_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10); INSERT INTO departments (department_id, department_name, manager_id, location_id) VALUES (10, 'IT', 101, 1001); INSERT INTO new_employee_department (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10, 'Information Technology', 1001); INSERT INTO new_employee_department (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20, 'Sales', 1002); -- 使用 MERGE INTO 和子查詢更新員工信息 MERGE INTO employees e USING ( SELECT ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, ned.manager_id, ned.department_id, d.department_name, d.location_id FROM new_employee_department ned LEFT JOIN departments d ON ned.department_id = d.department_id ) ned ON (e.employee_id = ned.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ned.email, e.salary = ned.salary, e.department_id = ned.department_id WHERE e.salary <> ned.salary OR e.email <> ned.email OR e.department_id <> ned.department_id WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, ned.manager_id, ned.department_id); -- 使用 MERGE INTO 和子查詢更新部門信息 MERGE INTO departments d USING ( SELECT ned.department_id, ned.department_name, ned.location_id, COUNT(e.employee_id) AS employee_count FROM new_employee_department ned LEFT JOIN employees e ON ned.employee_id = e.employee_id GROUP BY ned.department_id, ned.department_name, ned.location_id ) ned ON (d.department_id = ned.department_id) WHEN MATCHED THEN UPDATE SET d.department_name = ned.department_name, d.location_id = ned.location_id, d.manager_id = CASE WHEN ned.employee_count > 0 THEN 101 ELSE d.manager_id END WHERE d.department_name <> ned.department_name OR d.location_id <> ned.location_id WHEN NOT MATCHED THEN INSERT (department_id, department_name, location_id, manager_id) VALUES (ned.department_id, ned.department_name, ned.location_id, CASE WHEN ned.employee_count > 0 THEN 101 ELSE NULL END); -- 查詢合并后的結(jié)果 SELECT * FROM employees; SELECT * FROM departments;
案例 10:使用子查詢和條件判斷更新與插入
假設(shè)我們有 employees
表和 new_employees
表。new_employees
表中存儲了新的員工信息,但我們需要根據(jù)一定的條件來決定是否更新或插入記錄。例如,只有當(dāng)新員工的工資高于目標(biāo)表中現(xiàn)有員工的工資且電子郵件不同時,才進行更新;如果員工不存在,則插入新記錄。同時,我們還需要根據(jù)員工的工資來設(shè)置其績效獎金比例。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), performance_bonus NUMBER(2,2) ); -- 創(chuàng)建新員工表 CREATE TABLE new_employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10, 0.05); INSERT INTO new_employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10); INSERT INTO new_employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20); -- 使用 MERGE INTO 和條件判斷更新員工信息 MERGE INTO employees e USING new_employees ne ON (e.employee_id = ne.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ne.email, e.salary = ne.salary, e.performance_bonus = CASE WHEN ne.salary >= 6000 THEN 0.1 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END WHERE (ne.salary > e.salary AND e.email <> ne.email) OR (e.performance_bonus <> ( CASE WHEN ne.salary >= 6000 THEN 0.1 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END )) WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (ne.employee_id, ne.name, ne.email, ne.phone_number, ne.hire_date, ne.job_id, ne.salary, ne.commission_pct, ne.manager_id, ne.department_id, CASE WHEN ne.salary >= 6000 THEN 0.1 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END); -- 查詢合并后的結(jié)果 SELECT * FROM employees;
案例 11:使用子查詢和多表關(guān)聯(lián)更新與插入
假設(shè)我們有 employees
表、departments
表和 new_employee_department
表。new_employee_department
表中存儲了新的員工及其部門信息。我們需要將這些新數(shù)據(jù)同步到 employees
和 departments
表中。如果員工已存在,則更新其信息;如果部門已存在,則更新部門信息;如果員工或部門不存在,則插入新記錄。同時,我們還需要根據(jù)員工的工資和部門的地點來決定是否更新或插入記錄。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 創(chuàng)建部門表 CREATE TABLE departments ( department_id NUMBER(4) PRIMARY KEY, department_name VARCHAR2(30) NOT NULL, manager_id NUMBER(6), location_id NUMBER(4) ); -- 創(chuàng)建新員工部門表 CREATE TABLE new_employee_department ( employee_id NUMBER(6), name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), department_name VARCHAR2(30) NOT NULL, location_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10); INSERT INTO departments (department_id, department_name, manager_id, location_id) VALUES (10, 'IT', 101, 1001); INSERT INTO new_employee_department (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10, 'Information Technology', 1001); INSERT INTO new_employee_department (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20, 'Sales', 1002); -- 使用 MERGE INTO 和子查詢更新員工信息 MERGE INTO employees e USING ( SELECT ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, ned.manager_id, ned.department_id, ned.department_name, ned.location_id FROM new_employee_department ned ) ned ON (e.employee_id = ned.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ned.email, e.salary = ned.salary, e.department_id = ned.department_id WHERE (e.salary <> ned.salary AND ned.salary > 5000) OR (e.email <> ned.email AND ned.location_id = 1001) OR (e.department_id <> ned.department_id AND ned.department_name = 'Sales') WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, ned.manager_id, ned.department_id); -- 使用 MERGE INTO 和子查詢更新部門信息 MERGE INTO departments d USING ( SELECT ned.department_id, ned.department_name, ned.location_id, COUNT(e.employee_id) AS employee_count FROM new_employee_department ned LEFT JOIN employees e ON ned.employee_id = e.employee_id GROUP BY ned.department_id, ned.department_name, ned.location_id ) ned ON (d.department_id = ned.department_id) WHEN MATCHED THEN UPDATE SET d.department_name = ned.department_name, d.location_id = ned.location_id, d.manager_id = CASE WHEN ned.employee_count > 0 AND ned.location_id = 1001 THEN 101 WHEN ned.employee_count > 0 AND ned.location_id = 1002 THEN 102 ELSE d.manager_id END WHERE (d.department_name <> ned.department_name AND ned.location_id = 1001) OR (d.location_id <> ned.location_id AND ned.salary > 5000) OR (d.manager_id <> ( CASE WHEN ned.employee_count > 0 AND ned.location_id = 1001 THEN 101 WHEN ned.employee_count > 0 AND ned.location_id = 1002 THEN 102 ELSE d.manager_id END )) WHEN NOT MATCHED THEN INSERT (department_id, department_name, location_id, manager_id) VALUES (ned.department_id, ned.department_name, ned.location_id, CASE WHEN ned.location_id = 1001 THEN 101 WHEN ned.location_id = 1002 THEN 102 ELSE NULL END); -- 查詢合并后的結(jié)果 SELECT * FROM employees; SELECT * FROM departments;
案例 12:使用子查詢和條件判斷更新與插入
假設(shè)我們有 employees
表和 new_employees
表。new_employees
表中存儲了新的員工信息,但我們需要根據(jù)一定的條件來決定是否更新或插入記錄。例如,只有當(dāng)新員工的工資高于目標(biāo)表中現(xiàn)有員工的工資且電子郵件不同時,才進行更新;如果員工不存在,則插入新記錄。同時,我們還需要根據(jù)員工的工資來設(shè)置其績效獎金比例,并根據(jù)部門 ID 來設(shè)置其經(jīng)理 ID。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), performance_bonus NUMBER(2,2) ); -- 創(chuàng)建新員工表 CREATE TABLE new_employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10, 0.05); INSERT INTO new_employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10); INSERT INTO new_employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20); -- 使用 MERGE INTO 和條件判斷更新員工信息 MERGE INTO employees e USING new_employees ne ON (e.employee_id = ne.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ne.email, e.salary = ne.salary, e.manager_id = CASE WHEN ne.department_id = 10 THEN 101 WHEN ne.department_id = 20 THEN 102 ELSE e.manager_id END, e.performance_bonus = CASE WHEN ne.salary >= 6000 THEN 0.1 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END WHERE (ne.salary > e.salary AND e.email <> ne.email) OR (e.manager_id <> ( CASE WHEN ne.department_id = 10 THEN 101 WHEN ne.department_id = 20 THEN 102 ELSE e.manager_id END )) OR (e.performance_bonus <> ( CASE WHEN ne.salary >= 6000 THEN 0.1 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END )) WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (ne.employee_id, ne.name, ne.email, ne.phone_number, ne.hire_date, ne.job_id, ne.salary, ne.commission_pct, CASE WHEN ne.department_id = 10 THEN 101 WHEN ne.department_id = 20 THEN 102 ELSE NULL END, ne.department_id, CASE WHEN ne.salary >= 6000 THEN 0.1 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END); -- 查詢合并后的結(jié)果 SELECT * FROM employees;
案例 13:使用子查詢和多表關(guān)聯(lián)更新與插入
假設(shè)我們有 employees
表、departments
表和 new_employee_department
表。new_employee_department
表中存儲了新的員工及其部門信息。我們需要將這些新數(shù)據(jù)同步到 employees
和 departments
表中。如果員工已存在,則更新其信息;如果部門已存在,則更新部門信息;如果員工或部門不存在,則插入新記錄。同時,我們還需要根據(jù)員工的工資和部門的地點來決定是否更新或插入記錄,并根據(jù)員工的工資來設(shè)置其績效獎金比例。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), performance_bonus NUMBER(2,2) ); -- 創(chuàng)建部門表 CREATE TABLE departments ( department_id NUMBER(4) PRIMARY KEY, department_name VARCHAR2(30) NOT NULL, manager_id NUMBER(6), location_id NUMBER(4) ); -- 創(chuàng)建新員工部門表 CREATE TABLE new_employee_department ( employee_id NUMBER(6), name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), department_name VARCHAR2(30) NOT NULL, location_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10, 0.05); INSERT INTO departments (department_id, department_name, manager_id, location_id) VALUES (10, 'IT', 101, 1001); INSERT INTO new_employee_department (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10, 'Information Technology', 1001); INSERT INTO new_employee_department (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20, 'Sales', 1002); -- 使用 MERGE INTO 和子查詢更新員工信息 MERGE INTO employees e USING ( SELECT ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, ned.manager_id, ned.department_id, ned.department_name, ned.location_id FROM new_employee_department ned ) ned ON (e.employee_id = ned.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ned.email, e.salary = ned.salary, e.department_id = ned.department_id, e.performance_bonus = CASE WHEN ned.salary >= 6000 THEN 0.1 WHEN ned.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ned.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END WHERE (e.salary <> ned.salary AND ned.salary > 5000) OR (e.email <> ned.email AND ned.location_id = 1001) OR (e.department_id <> ned.department_id AND ned.department_name = 'Sales') OR (e.performance_bonus <> ( CASE WHEN ned.salary >= 6000 THEN 0.1 WHEN ned.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ned.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END )) WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, ned.manager_id, ned.department_id, CASE WHEN ned.salary >= 6000 THEN 0.1 WHEN ned.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ned.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END); -- 使用 MERGE INTO 和子查詢更新部門信息 MERGE INTO departments d USING ( SELECT ned.department_id, ned.department_name, ned.location_id, COUNT(e.employee_id) AS employee_count FROM new_employee_department ned LEFT JOIN employees e ON ned.employee_id = e.employee_id GROUP BY ned.department_id, ned.department_name, ned.location_id ) ned ON (d.department_id = ned.department_id) WHEN MATCHED THEN UPDATE SET d.department_name = ned.department_name, d.location_id = ned.location_id, d.manager_id = CASE WHEN ned.employee_count > 0 AND ned.location_id = 1001 THEN 101 WHEN ned.employee_count > 0 AND ned.location_id = 1002 THEN 102 ELSE d.manager_id END WHERE (d.department_name <> ned.department_name AND ned.location_id = 1001) OR (d.location_id <> ned.location_id AND ned.salary > 5000) OR (d.manager_id <> ( CASE WHEN ned.employee_count > 0 AND ned.location_id = 1001 THEN 101 WHEN ned.employee_count > 0 AND ned.location_id = 1002 THEN 102 ELSE d.manager_id END )) WHEN NOT MATCHED THEN INSERT (department_id, department_name, location_id, manager_id) VALUES (ned.department_id, ned.department_name, ned.location_id, CASE WHEN ned.location_id = 1001 THEN 101 WHEN ned.location_id = 1002 THEN 102 ELSE NULL END); -- 查詢合并后的結(jié)果 SELECT * FROM employees; SELECT * FROM departments;
案例 14:使用子查詢和條件判斷更新與插入
假設(shè)我們有 employees
表和 new_employees
表。new_employees
表中存儲了新的員工信息,但我們需要根據(jù)一定的條件來決定是否更新或插入記錄。例如,只有當(dāng)新員工的工資高于目標(biāo)表中現(xiàn)有員工的工資且電子郵件不同時,才進行更新;如果員工不存在,則插入新記錄。同時,我們還需要根據(jù)員工的工資來設(shè)置其績效獎金比例,并根據(jù)部門 ID 來設(shè)置其經(jīng)理 ID。此外,我們還需要根據(jù)員工的工資和部門 ID 來決定是否更新其工作職位。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), performance_bonus NUMBER(2,2) ); -- 創(chuàng)建新員工表 CREATE TABLE new_employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10, 0.05); INSERT INTO new_employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10); INSERT INTO new_employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20); -- 使用 MERGE INTO 和條件判斷更新員工信息 MERGE INTO employees e USING new_employees ne ON (e.employee_id = ne.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ne.email, e.salary = ne.salary, e.manager_id = CASE WHEN ne.department_id = 10 THEN 101 WHEN ne.department_id = 20 THEN 102 ELSE e.manager_id END, e.performance_bonus = CASE WHEN ne.salary >= 6000 THEN 0.1 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END, e.job_id = CASE WHEN ne.salary >= 7000 AND ne.department_id = 20 THEN 'SA_MGR' ELSE e.job_id END WHERE (ne.salary > e.salary AND e.email <> ne.email) OR (e.manager_id <> ( CASE WHEN ne.department_id = 10 THEN 101 WHEN ne.department_id = 20 THEN 102 ELSE e.manager_id END )) OR (e.performance_bonus <> ( CASE WHEN ne.salary >= 6000 THEN 0.1 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END )) OR (e.job_id <> ( CASE WHEN ne.salary >= 7000 AND ne.department_id = 20 THEN 'SA_MGR' ELSE e.job_id END )) WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (ne.employee_id, ne.name, ne.email, ne.phone_number, ne.hire_date, CASE WHEN ne.salary >= 7000 AND ne.department_id = 20 THEN 'SA_MGR' ELSE ne.job_id END, ne.salary, ne.commission_pct, CASE WHEN ne.department_id = 10 THEN 101 WHEN ne.department_id = 20 THEN 102 ELSE NULL END, ne.department_id, CASE WHEN ne.salary >= 6000 THEN 0.1 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END); -- 查詢合并后的結(jié)果 SELECT * FROM employees;
案例 15:使用子查詢和多表關(guān)聯(lián)更新與插入
假設(shè)我們有 employees
表、departments
表和 new_employee_department
表。new_employee_department
表中存儲了新的員工及其部門信息。我們需要將這些新數(shù)據(jù)同步到 employees
和 departments
表中。如果員工已存在,則更新其信息;如果部門已存在,則更新部門信息;如果員工或部門不存在,則插入新記錄。同時,我們還需要根據(jù)員工的工資和部門的地點來決定是否更新或插入記錄,并根據(jù)員工的工資來設(shè)置其績效獎金比例,根據(jù)部門的地點來設(shè)置其經(jīng)理 ID。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), performance_bonus NUMBER(2,2) ); -- 創(chuàng)建部門表 CREATE TABLE departments ( department_id NUMBER(4) PRIMARY KEY, department_name VARCHAR2(30) NOT NULL, manager_id NUMBER(6), location_id NUMBER(4) ); -- 創(chuàng)建新員工部門表 CREATE TABLE new_employee_department ( employee_id NUMBER(6), name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), department_name VARCHAR2(30) NOT NULL, location_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10, 0.05); INSERT INTO departments (department_id, department_name, manager_id, location_id) VALUES (10, 'IT', 101, 1001); INSERT INTO new_employee_department (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10, 'Information Technology', 1001); INSERT INTO new_employee_department (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20, 'Sales', 1002); -- 使用 MERGE INTO 和子查詢更新員工信息 MERGE INTO employees e USING ( SELECT ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, ned.manager_id, ned.department_id, ned.department_name, ned.location_id FROM new_employee_department ned ) ned ON (e.employee_id = ned.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ned.email, e.salary = ned.salary, e.department_id = ned.department_id, e.performance_bonus = CASE WHEN ned.salary >= 6000 THEN 0.1 WHEN ned.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ned.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END, e.manager_id = CASE WHEN ned.location_id = 1001 THEN 101 WHEN ned.location_id = 1002 THEN 102 ELSE e.manager_id END WHERE (e.salary <> ned.salary AND ned.salary > 5000) OR (e.email <> ned.email AND ned.location_id = 1001) OR (e.department_id <> ned.department_id AND ned.department_name = 'Sales') OR (e.performance_bonus <> ( CASE WHEN ned.salary >= 6000 THEN 0.1 WHEN ned.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ned.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END )) OR (e.manager_id <> ( CASE WHEN ned.location_id = 1001 THEN 101 WHEN ned.location_id = 1002 THEN 102 ELSE e.manager_id END )) WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, CASE WHEN ned.location_id = 1001 THEN 101 WHEN ned.location_id = 1002 THEN 102 ELSE NULL END, ned.department_id, CASE WHEN ned.salary >= 6000 THEN 0.1 WHEN ned.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ned.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END); -- 使用 MERGE INTO 和子查詢更新部門信息 MERGE INTO departments d USING ( SELECT ned.department_id, ned.department_name, ned.location_id, COUNT(e.employee_id) AS employee_count FROM new_employee_department ned LEFT JOIN employees e ON ned.employee_id = e.employee_id GROUP BY ned.department_id, ned.department_name, ned.location_id ) ned ON (d.department_id = ned.department_id) WHEN MATCHED THEN UPDATE SET d.department_name = ned.department_name, d.location_id = ned.location_id, d.manager_id = CASE WHEN ned.employee_count > 0 AND ned.location_id = 1001 THEN 101 WHEN ned.employee_count > 0 AND ned.location_id = 1002 THEN 102 ELSE d.manager_id END WHERE (d.department_name <> ned.department_name AND ned.location_id = 1001) OR (d.location_id <> ned.location_id AND ned.salary > 5000) OR (d.manager_id <> ( CASE WHEN ned.employee_count > 0 AND ned.location_id = 1001 THEN 101 WHEN ned.employee_count > 0 AND ned.location_id = 1002 THEN 102 ELSE d.manager_id END )) WHEN NOT MATCHED THEN INSERT (department_id, department_name, location_id, manager_id) VALUES (ned.department_id, ned.department_name, ned.location_id, CASE WHEN ned.location_id = 1001 THEN 101 WHEN ned.location_id = 1002 THEN 102 ELSE NULL END); -- 查詢合并后的結(jié)果 SELECT * FROM employees; SELECT * FROM departments;
案例 16:使用子查詢和條件判斷更新與插入
假設(shè)我們有 employees
表和 new_employees
表。new_employees
表中存儲了新的員工信息,但我們需要根據(jù)一定的條件來決定是否更新或插入記錄。例如,只有當(dāng)新員工的工資高于目標(biāo)表中現(xiàn)有員工的工資且電子郵件不同時,才進行更新;如果員工不存在,則插入新記錄。同時,我們還需要根據(jù)員工的工資來設(shè)置其績效獎金比例,并根據(jù)部門 ID 來設(shè)置其經(jīng)理 ID。此外,我們還需要根據(jù)員工的工資和部門 ID 來決定是否更新其工作職位,并根據(jù)員工的工資來設(shè)置其傭金比例。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), performance_bonus NUMBER(2,2) ); -- 創(chuàng)建新員工表 CREATE TABLE new_employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10, 0.05); INSERT INTO new_employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10); INSERT INTO new_employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20); -- 使用 MERGE INTO 和條件判斷更新員工信息 MERGE INTO employees e USING new_employees ne ON (e.employee_id = ne.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ne.email, e.salary = ne.salary, e.manager_id = CASE WHEN ne.department_id = 10 THEN 101 WHEN ne.department_id = 20 THEN 102 ELSE e.manager_id END, e.performance_bonus = CASE WHEN ne.salary >= 6000 THEN 0.1 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END, e.job_id = CASE WHEN ne.salary >= 7000 AND ne.department_id = 20 THEN 'SA_MGR' ELSE e.job_id END, e.commission_pct = CASE WHEN ne.salary >= 6000 THEN 0.2 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.15 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.1 ELSE 0.05 END WHERE (ne.salary > e.salary AND e.email <> ne.email) OR (e.manager_id <> ( CASE WHEN ne.department_id = 10 THEN 101 WHEN ne.department_id = 20 THEN 102 ELSE e.manager_id END )) OR (e.performance_bonus <> ( CASE WHEN ne.salary >= 6000 THEN 0.1 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END )) OR (e.job_id <> ( CASE WHEN ne.salary >= 7000 AND ne.department_id = 20 THEN 'SA_MGR' ELSE e.job_id END )) OR (e.commission_pct <> ( CASE WHEN ne.salary >= 6000 THEN 0.2 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.15 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.1 ELSE 0.05 END )) WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (ne.employee_id, ne.name, ne.email, ne.phone_number, ne.hire_date, CASE WHEN ne.salary >= 7000 AND ne.department_id = 20 THEN 'SA_MGR' ELSE ne.job_id END, ne.salary, CASE WHEN ne.salary >= 6000 THEN 0.2 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.15 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.1 ELSE 0.05 END, CASE WHEN ne.department_id = 10 THEN 101 WHEN ne.department_id = 20 THEN 102 ELSE NULL END, ne.department_id, CASE WHEN ne.salary >= 6000 THEN 0.1 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END); -- 查詢合并后的結(jié)果 SELECT * FROM employees;
案例 17:使用子查詢和多表關(guān)聯(lián)更新與插入
假設(shè)我們有 employees
表、departments
表和 new_employee_department
表。new_employee_department
表中存儲了新的員工及其部門信息。我們需要將這些新數(shù)據(jù)同步到 employees
和 departments
表中。如果員工已存在,則更新其信息;如果部門已存在,則更新部門信息;如果員工或部門不存在,則插入新記錄。同時,我們還需要根據(jù)員工的工資和部門的地點來決定是否更新或插入記錄,并根據(jù)員工的工資來設(shè)置其績效獎金比例,根據(jù)部門的地點來設(shè)置其經(jīng)理 ID。此外,我們還需要根據(jù)員工的工資和部門 ID 來決定是否更新其工作職位,并根據(jù)員工的工資來設(shè)置其傭金比例。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), performance_bonus NUMBER(2,2) ); -- 創(chuàng)建部門表 CREATE TABLE departments ( department_id NUMBER(4) PRIMARY KEY, department_name VARCHAR2(30) NOT NULL, manager_id NUMBER(6), location_id NUMBER(4) ); -- 創(chuàng)建新員工部門表 CREATE TABLE new_employee_department ( employee_id NUMBER(6), name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), department_name VARCHAR2(30) NOT NULL, location_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10, 0.05); INSERT INTO departments (department_id, department_name, manager_id, location_id) VALUES (10, 'IT', 101, 1001); INSERT INTO new_employee_department (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10, 'Information Technology', 1001); INSERT INTO new_employee_department (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, department_name, location_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20, 'Sales', 1002); -- 使用 MERGE INTO 和子查詢更新員工信息 MERGE INTO employees e USING ( SELECT ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, ned.job_id, ned.salary, ned.commission_pct, ned.manager_id, ned.department_id, ned.department_name, ned.location_id FROM new_employee_department ned ) ned ON (e.employee_id = ned.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ned.email, e.salary = ned.salary, e.department_id = ned.department_id, e.performance_bonus = CASE WHEN ned.salary >= 6000 THEN 0.1 WHEN ned.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ned.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END, e.manager_id = CASE WHEN ned.location_id = 1001 THEN 101 WHEN ned.location_id = 1002 THEN 102 ELSE e.manager_id END, e.job_id = CASE WHEN ned.salary >= 7000 AND ned.department_id = 20 THEN 'SA_MGR' ELSE e.job_id END, e.commission_pct = CASE WHEN ned.salary >= 6000 THEN 0.2 WHEN ned.salary BETWEEN 5000 AND 5999 THEN 0.15 WHEN ned.salary BETWEEN 4000 AND 4999 THEN 0.1 ELSE 0.05 END WHERE (e.salary <> ned.salary AND ned.salary > 5000) OR (e.email <> ned.email AND ned.location_id = 1001) OR (e.department_id <> ned.department_id AND ned.department_name = 'Sales') OR (e.performance_bonus <> ( CASE WHEN ned.salary >= 6000 THEN 0.1 WHEN ned.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ned.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END )) OR (e.manager_id <> ( CASE WHEN ned.location_id = 1001 THEN 101 WHEN ned.location_id = 1002 THEN 102 ELSE e.manager_id END )) OR (e.job_id <> ( CASE WHEN ned.salary >= 7000 AND ned.department_id = 20 THEN 'SA_MGR' ELSE e.job_id END )) OR (e.commission_pct <> ( CASE WHEN ned.salary >= 6000 THEN 0.2 WHEN ned.salary BETWEEN 5000 AND 5999 THEN 0.15 WHEN ned.salary BETWEEN 4000 AND 4999 THEN 0.1 ELSE 0.05 END )) WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (ned.employee_id, ned.name, ned.email, ned.phone_number, ned.hire_date, CASE WHEN ned.salary >= 7000 AND ned.department_id = 20 THEN 'SA_MGR' ELSE ned.job_id END, ned.salary, CASE WHEN ned.salary >= 6000 THEN 0.2 WHEN ned.salary BETWEEN 5000 AND 5999 THEN 0.15 WHEN ned.salary BETWEEN 4000 AND 4999 THEN 0.1 ELSE 0.05 END, CASE WHEN ned.location_id = 1001 THEN 101 WHEN ned.location_id = 1002 THEN 102 ELSE NULL END, ned.department_id, CASE WHEN ned.salary >= 6000 THEN 0.1 WHEN ned.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ned.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END); -- 使用 MERGE INTO 和子查詢更新部門信息 MERGE INTO departments d USING ( SELECT ned.department_id, ned.department_name, ned.location_id, COUNT(e.employee_id) AS employee_count FROM new_employee_department ned LEFT JOIN employees e ON ned.employee_id = e.employee_id GROUP BY ned.department_id, ned.department_name, ned.location_id ) ned ON (d.department_id = ned.department_id) WHEN MATCHED THEN UPDATE SET d.department_name = ned.department_name, d.location_id = ned.location_id, d.manager_id = CASE WHEN ned.employee_count > 0 AND ned.location_id = 1001 THEN 101 WHEN ned.employee_count > 0 AND ned.location_id = 1002 THEN 102 ELSE d.manager_id END WHERE (d.department_name <> ned.department_name AND ned.location_id = 1001) OR (d.location_id <> ned.location_id AND ned.salary > 5000) OR (d.manager_id <> ( CASE WHEN ned.employee_count > 0 AND ned.location_id = 1001 THEN 101 WHEN ned.employee_count > 0 AND ned.location_id = 1002 THEN 102 ELSE d.manager_id END )) WHEN NOT MATCHED THEN INSERT (department_id, department_name, location_id, manager_id) VALUES (ned.department_id, ned.department_name, ned.location_id, CASE WHEN ned.location_id = 1001 THEN 101 WHEN ned.location_id = 1002 THEN 102 ELSE NULL END); -- 查詢合并后的結(jié)果 SELECT * FROM employees; SELECT * FROM departments;
假設(shè)我們有 employees
表和 new_employees
表。new_employees
表中存儲了新的員工信息,但我們需要根據(jù)一定的條件來決定是否更新或插入記錄。例如,只有當(dāng)新員工的工資高于目標(biāo)表中現(xiàn)有員工的工資且電子郵件不同時,才進行更新;如果員工不存在,則插入新記錄。同時,我們還需要根據(jù)員工的工資來設(shè)置其績效獎金比例,并根據(jù)部門 ID 來設(shè)置其經(jīng)理 ID。此外,我們還需要根據(jù)員工的工資和部門 ID 來決定是否更新其工作職位,并根據(jù)員工的工資來設(shè)置其傭金比例。最后,我們還需要根據(jù)員工的工資來設(shè)置其電話號碼。
-- 創(chuàng)建員工表 CREATE TABLE employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4), performance_bonus NUMBER(2,2) ); -- 創(chuàng)建新員工表 CREATE TABLE new_employees ( employee_id NUMBER(6) PRIMARY KEY, name VARCHAR2(50) NOT NULL, email VARCHAR2(50), phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10), salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4) ); -- 插入初始數(shù)據(jù) INSERT INTO employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (100, 'Alice', 'alice@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5000, 0.1, 101, 10, 0.05); INSERT INTO new_employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (100, 'Alice', 'alice_new@example.com', '555-1234', SYSDATE - 100, 'IT_PROG', 5500, 0.1, 101, 10); INSERT INTO new_employees (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (101, 'Bob', 'bob@example.com', '555-5678', SYSDATE - 50, 'SA_REP', 6000, 0.2, 102, 20); -- 使用 MERGE INTO 和條件判斷更新員工信息 MERGE INTO employees e USING new_employees ne ON (e.employee_id = ne.employee_id) WHEN MATCHED THEN UPDATE SET e.email = ne.email, e.salary = ne.salary, e.manager_id = CASE WHEN ne.department_id = 10 THEN 101 WHEN ne.department_id = 20 THEN 102 ELSE e.manager_id END, e.performance_bonus = CASE WHEN ne.salary >= 6000 THEN 0.1 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END, e.job_id = CASE WHEN ne.salary >= 7000 AND ne.department_id = 20 THEN 'SA_MGR' ELSE e.job_id END, e.commission_pct = CASE WHEN ne.salary >= 6000 THEN 0.2 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.15 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.1 ELSE 0.05 END, e.phone_number = CASE WHEN ne.salary >= 6000 THEN '555-5678' WHEN ne.salary BETWEEN 5000 AND 5999 THEN '555-4321' ELSE e.phone_number END WHERE (ne.salary > e.salary AND e.email <> ne.email) OR (e.manager_id <> ( CASE WHEN ne.department_id = 10 THEN 101 WHEN ne.department_id = 20 THEN 102 ELSE e.manager_id END )) OR (e.performance_bonus <> ( CASE WHEN ne.salary >= 6000 THEN 0.1 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.07 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.05 ELSE 0.03 END )) OR (e.job_id <> ( CASE WHEN ne.salary >= 7000 AND ne.department_id = 20 THEN 'SA_MGR' ELSE e.job_id END )) OR (e.commission_pct <> ( CASE WHEN ne.salary >= 6000 THEN 0.2 WHEN ne.salary BETWEEN 5000 AND 5999 THEN 0.15 WHEN ne.salary BETWEEN 4000 AND 4999 THEN 0.1 ELSE 0.05 END )) OR (e.phone_number <> ( CASE WHEN ne.salary >= 6000 THEN '555-5678' WHEN ne.salary BETWEEN 5000 AND 5999 THEN '555-4321' ELSE e.phone_number END )) WHEN NOT MATCHED THEN INSERT (employee_id, name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id, performance_bonus) VALUES (ne.employee_id, ne.name, ne.email, CASE WHEN ne.salary >= 6000 THEN '555-5678' WHEN ne.salary BETWEEN 5000 AND 5999 THEN '555-4321' ELSE ne.phone_number END, ne.hire_date, CASE WHEN ne.salary >= 7000 AND ne.department_id = 20 THEN 'SA_MGR' ELSE ne.job_id END, ne.salary, CASE WHEN ne
四、總結(jié)
MERGE INTO
語句是 Oracle 數(shù)據(jù)庫中一個強大的工具,用于將兩個表的數(shù)據(jù)進行合并操作。通過指定匹配條件,可以靈活地對目標(biāo)表進行更新或插入操作。在實際應(yīng)用中,MERGE INTO
語句廣泛應(yīng)用于數(shù)據(jù)整合、數(shù)據(jù)同步和數(shù)據(jù)初始化等場景。好的,以下為你提供一些更復(fù)雜的 MERGE INTO
語句案例,這些案例涵蓋了多表關(guān)聯(lián)、子查詢、條件判斷等多種復(fù)雜場景。
到此這篇關(guān)于Oracle高級語法篇之merge into語句復(fù)雜案例的文章就介紹到這了,更多相關(guān)Oracle merge into語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
oracle中函數(shù) trunc(),round(),ceil(),floor的使用詳解
這篇文章主要介紹了oracle中函數(shù) trunc(),round(),ceil(),floor的使用詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03oracle數(shù)據(jù)庫導(dǎo)入導(dǎo)出命令使用方法
這篇文章主要介紹了oracle數(shù)據(jù)庫導(dǎo)入導(dǎo)出命令格式,對單表導(dǎo)出、多張表導(dǎo)出的方法2013-11-11Oracle監(jiān)聽器被優(yōu)化大師掛掉后的完美解決方法
這篇文章主要介紹了Oracle監(jiān)聽器被優(yōu)化大師掛掉后的完美解決方法,需要的朋友可以參考下2017-08-08Oracle創(chuàng)建帶有參數(shù)的視圖代碼介紹
這篇文章主要介紹了Oracle創(chuàng)建帶有參數(shù)的視圖代碼介紹,簡介地介紹了創(chuàng)建方法,具有一定參考價值,需要的朋友可以了解下。2017-09-09