SQL Server merge用法


有兩個表名:source 表和 target 表,並且要根據 source 表中匹配的值更新 target 表。

有三種情況:

  • source 表有一些 target 表不存在的行。在這種情況下,需要將 source 表中的行插入到 target 中。
  • target 表有一些 source表不存在的行。這種情況下,需要從 target 表中刪除行。
  • source 表的某些行具有與 target 表中的行相同的鍵。但是,這些行在非鍵列中具有不同的值。這種情況下,需要使用來自 source 表中的值更新 target 表中的行。

下圖,說明了 source 表和 target 表 的一些操作:插入,更新,刪除:

如果單獨使用 INSERT, UPDATE和DELETE語句,則需要三個單獨的語句,來使 source 表中的匹配行的數據更新到 target表。

但是,使用 merge 可以同時執行三個操作。下面是 merge語句的語法:

MERGE target_table USING source_table
ON merge_condition
WHEN MATCHED
    THEN update_statement
WHEN NOT MATCHED
    THEN insert_statement
WHEN NOT MATCHED BY SOURCE
    THEN DELETE;

使用示例:

CREATE TABLE sales.category (
    category_id INT PRIMARY KEY,
    category_name VARCHAR(255) NOT NULL,
    amount DECIMAL(10 , 2 )
);

INSERT INTO sales.category(category_id, category_name, amount)
VALUES(1,'Children Bicycles',15000),
    (2,'Comfort Bicycles',25000),
    (3,'Cruisers Bicycles',13000),
    (4,'Cyclocross Bicycles',10000);


CREATE TABLE sales.category_staging (
    category_id INT PRIMARY KEY,
    category_name VARCHAR(255) NOT NULL,
    amount DECIMAL(10 , 2 )
);


INSERT INTO sales.category_staging(category_id, category_name, amount)
VALUES(1,'Children Bicycles',15000),
    (3,'Cruisers Bicycles',13000),
    (4,'Cyclocross Bicycles',20000),
    (5,'Electric Bikes',10000),
    (6,'Mountain Bikes',10000);

要使用 sales.category_staging(源表)中的值將數據更新到 sales.category(目標表),要使用 merge:

MERGE sales.category t 
    USING sales.category_staging s
ON (s.category_id = t.category_id)
WHEN MATCHED
    THEN UPDATE SET 
        t.category_name = s.category_name,
        t.amount = s.amount
WHEN NOT MATCHED BY TARGET 
    THEN INSERT (category_id, category_name, amount)
         VALUES (s.category_id, s.category_name, s.amount)
WHEN NOT MATCHED BY SOURCE 
    THEN DELETE;

執行過程如下圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM