Trong hướng dẫn này, bạn sẽ học cách sử dụng câu lệnh MERGE
trong SQL Server để cập nhật dữ liệu trong bảng dựa trên các giá trị được khớp từ một bảng khác.
Giả sử, bạn có hai bảng được gọi là bảng nguồn (source table) và bảng mục tiêu (target table), và bạn cần cập nhật bảng mục tiêu dựa trên các giá trị được khớp từ bảng nguồn. Có ba trường hợp:
INSERT
các hàng trong bảng nguồn vào bảng đích.DELETE
các hàng khỏi bảng đích.UPDATE
các hàng trong bảng đích với các giá trị đến từ bảng nguồn.Hình ảnh sau minh họa bảng nguồn và bảng đích với các hành động tương ứng: chèn, cập nhật và xóa:
Nếu bạn sử dụng câu lệnh INSERT
, UPDATE
và DELETE
độc lập, bạn phải xây dựng ba câu lệnh riêng biệt để cập nhật dữ liệu vào bảng đích với các hàng kết hợp từ bảng nguồn.
Tuy nhiên, SQL Server cung cấp câu lệnh MERGE
cho phép bạn thực hiện ba hành động cùng một lúc. Sau đây là cú pháp của câu lệnh 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;
Đầu tiên, bạn chỉ định bảng đích và bảng nguồn trong mệnh đề MERGE
.
Thứ hai, biểu thức merge_condition
xác định cách các hàng từ bảng nguồn được khớp với các hàng từ bảng đích. Nó tương tự như điều kiện join trong mệnh đề JOIN. Thông thường, bạn sử dụng các cột khóa hoặc khóa chính (primary key) hoặc khóa duy nhất (unique key) để đối sánh.
Thứ ba, biểu thức merge_condition
trả về kết quả trong ba trạng thái: MATCHED
, NOT MATCHED
, và NOT MATCHED BY SOURCE
.
MATCHED
: đây là những hàng phù hợp với điều kiện hợp nhất. Trong biểu đồ, chúng được hiển thị dưới dạng màu xanh lam. Đối với các hàng phù hợp, bạn cần cập nhật các cột hàng trong bảng đích với các giá trị từ bảng nguồn.NOT MATCHED
: đây là những hàng từ bảng nguồn không có bất kỳ hàng nào phù hợp trong bảng đích. Trong sơ đồ, chúng được hiển thị dưới dạng màu cam. Trong trường hợp này, bạn cần thêm các hàng từ bảng nguồn vào bảng đích. Lưu ý rằng NOT MATCHED
còn được gọi là NOT MATCHED BY TARGET
.NOT MATCHED BY SOURCE
: đây là những hàng trong bảng đích không khớp với bất kỳ hàng nào trong bảng nguồn. Chúng được hiển thị dưới dạng màu xanh lá cây trong sơ đồ. Nếu bạn muốn đồng bộ hóa bảng mục tiêu với dữ liệu từ bảng nguồn, thì bạn sẽ cần sử dụng điều kiện đối sánh này để xóa các hàng khỏi bảng mục tiêu.Giả sử chúng ta có hai bảng sales.category
và sales.category_staging
lưu trữ doanh số bán hàng theo danh mục sản phẩm.
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);
Để cập nhật dữ liệu vào bảng sales.category
(bảng đích) với các giá trị từ bảng sales.category_staging
(bảng nguồn), bạn sử dụng câu lệnh MERGE
sau :
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;
Trong ví dụ này, chúng tôi đã sử dụng giá trị trong cột category_id
trong cả hai bảng làm điều kiện hợp nhất.
sales.category_staging
khớp với các hàng từ bảng đích, do đó, câu lệnh MERGE
cập nhật các giá trị trong các cột category_name và amount trong bảng sales.category
.sales.category_staging
không tồn tại trong bảng sales.category
, vì vậy câu lệnh MERGE
chèn các hàng này vào bảng đích.sales.category
không tồn tại trong bảng sales.sales_staging
, do đó, câu lệnh MERGE
sẽ xóa hàng này.Kết quả của việc hợp nhất, dữ liệu trong bảng sales.category
được đồng bộ hóa hoàn toàn với dữ liệu trong bảng sales.category_staging
.
Trong hướng dẫn này, bạn đã học cách sử dụng câu lệnh MERGE
trong SQL Server để thực hiện các thay đổi trong bảng dựa trên các giá trị khớp từ một bảng khác.
Bạn có thể vui lòng tắt trình chặn quảng cáo ❤️ để hỗ trợ chúng tôi duy trì hoạt động của trang web.
Trong hướng dẫn này, bạn sẽ tìm hiểu về GUID trong SQL Server và cách sử dụng hàm NEWID() để tạo giá trị GUID.
Trong hướng dẫn này, bạn sẽ học cách sử dụng kiểu dữ liệu DATETIMEOFFSET trong SQL Server để thao tác datetime với múi giờ.
Trong hướng dẫn này, bạn sẽ học cách lưu trữ thời gian trong ngày trong cơ sở dữ liệu bằng cách sử dụng kiểu dữ liệu TIME trong SQL Server.
Trong hướng dẫn này, bạn sẽ học cách sử dụng kiểu dữ liệu DATE trong SQL Server để lưu trữ dữ liệu ngày tháng trong một bảng.