SQL Server MERGE(合並)語句


如何使用SQL Server MERGE語句基於與另一個表匹配的值來更新表中的數據。

 

 SQL Server MERGE語句

 

假設有兩個表,分別稱為源表和目標表,並且需要根據與源表匹配的值來更新目標表。有以下三種情況:

 

  1. 源表中有一些目標表中不存在的行。在這種情況下,需要將源表中的行插入目標表中。
  2. 目標表中的某些行在源表中不存在。在這種情況下,需要從目標表中刪除行。
  3. 源表中的某些行與目標表中的行具有相同的鍵。但是,這些行在非鍵列中具有不同的值。在這種情況下,需要使用源表中的值更新目標表中的行。

 

下圖說明了源表和目標表以及相應的操作:插入,更新和刪除:

 

 

 

 

 如果使用INSERTUPDATE以及DELETE單獨的語句,你必須建立三個單獨的語句從源表匹配的行更新數據到目標表。

 

但是,SQL Server提供了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;

 

首先,在MERGE子句中指定目標表和源表。

 

其次,merge_condition確定源表中的行與目標表中的行如何匹配。它類似於join子句中的join條件。通常,使用主鍵或唯一鍵的鍵列進行匹配。

 

三,merge_condition結果有三種狀態:MATCHEDNOT MATCHED,和NOT MATCHED BY SOURCE

 

MATCHED:這些是符合合並條件的行。對於匹配的行,需要使用源表中的值更新目標表中的行列。

NOT MATCHED:這些是源表中的行,目標表中沒有任何匹配的行。在這種情況下,需要將源表中的行添加到目標表中。請注意,NOT MATCHED也稱為NOT MATCHED BY TARGET。

NO MATCHED BY SOURCE:這些是目標表中的行,與源表中的任何行都不匹配。如果要使目標表與源表中的數據同步,則需要使用此匹配條件從目標表中刪除行。

 

SQL Server MERGE語句示例

 

假設我們有兩個表,sales.category並且sales.category_staging按產品類別存儲銷售額。

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,'自行車',15000),
    (2,'摩托車',25000),
    (3,'汽車',13000),
    (4,'火車',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,'自行車',15000),
    (3,'汽車',13000),
    (4,'火車',20000),
    (5,'飛機',10000),
    (6,'火箭',10000);

要使用(源表)中sales.category的值將數據更新到(目標sales.category_staging表),使用以下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;

 

SQL Server合並示例

 

在此示例中,我們將category_id兩個表中的列中的值用作合並條件。

  • 首先,sales.category_staging表中ID為1、3、4的行與目標表中的行匹配,因此,該MERGE語句更新了表中類別名稱和數量列中的值sales.category。
  • 其次,sales.category_staging表中ID為5和6的行在表中不存在sales.category,因此該MERGE語句將這些行插入到目標表中。
  • 第三,sales.category表中ID為2的行在表中不存在sales.sales_staging,因此,該MERGE語句刪除了該行。

 

 

合並的結果是,sales.category表中的數據與sales.category_staging表中的數據完全同步  。

 


免責聲明!

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



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