Hỏi Đáp SQL------------ Không có câu hỏi nào là sơ đẳng --------

Cách thức sử dụng lệnh MERGE

MERGE là lệnh dùng để sửa đổi (update/insert/delete) dữ liệu của 1 bảng dựa vào kết quà so sánh với 1 bảng nào đó. Câu lệnh sử dụng MERGE thường ngắn gọn và hiệu quả hơn các câu lệnh thông thường cho cùng 1 điều kiện.

Tuy nhiên nó ít được sử dụng vì nó chỉ có từ bản 2008. Đồng thời nó có 1 số giới hạn và nhất là dễ lẫn lộn trong những yêu cầu phức tạp.

Đoạn mã sau sẽ dùng MERGE sửa đổi bảng @temp1 dựa vào điều kiện so sánh với bảng @temp2:

declare @temp1 table(id int, a int, b int, c int);
insert into @temp1 values(1,2,3,4),(2,2,3,4),(3,2,3,4),(4,2,3,4);

declare @temp2 table(id int, a int, b int, c int, d int);
insert into @temp2 values(1,6,7,8,1),(2,22,33,44,1),(6,6,6,6,1);

select * from @temp1;
select * from @temp2;

declare @id int = 2, @a int = 10, @b int = 20, @c int = 30 ;

merge into @temp1 as bc
using @temp2 as bp 
on bc.id=bp.id 
when matched
then update set a=bp.a, b=bp.b, c=bp.c --(update hay delete)
when not matched 
then insert (id,a,b,c) values(bp.id, bp.a,bp.b,500) --(insert)
when not matched by source 
then update set a=@a, b=@b, c=@c --(update hay delete)
;

select * from @temp1;

---------- kết quả truy xuất bảng temp1

id          a           b           c
----------- ----------- ----------- -----------
1           2           3           4
2           2           3           4
3           2           3           4
4           2           3           4


----------kết quả truy xuất bảng temp2

id          a           b           c           d
----------- ----------- ----------- ----------- -----------
1           6           7           8           1
2           22          33          44          1
6           6           6           6           1



----------kết quả truy xuất bảng temp1 sau khi MERGE

id          a           b           c
----------- ----------- ----------- -----------
1           6           7           8
2           22          33          44
3           10          20          30
4           10          20          30
6           6           6           500


Đoạn MERGE gồm 2 phần chính:

A -
merge into @temp1 as bc
using @temp2 as bp 
on bc.id=bp.id 

Cái này so sánh giá trị id của bảng @temp1 và bảng @temp2

B -
when matched
then update set a=bp.a, b=bp.b, c=bp.c --(update hay delete)
when not matched 
then insert (id,a,b,c) values(bp.id, bp.a,bp.b,500) --(insert)
when not matched by source 
then update set a=@a, b=@b, c=@c --(update hay delete)

Cái này là việc sửa đổi bảng @temp1 dựa vào kết quả so sánh ở phần A. 

Câu hỏi quan trọng là : Khi nào thì áp dụng cho các trường hợp WHEN. Sẽ dễ dàng hơn nếu bạn kết hợp vào bảng kết quả ở trên.

when matched - dành cho những dòng có ở bảng @temp2 và có ở bảng @temp1 - id=1 và 2
when not matched - dành cho những dòng có ở bảng @temp2 mà không có ở bảng @temp1 - id=6
when not matched by source - dành cho những dòng không có ớ @temp2 nhưng có ở bảng @temp1 - id=3 và 4.

Lúc này có lẽ bạn đã thấy vấn đề trở nên sáng sủa.

Trong thực tế, sẽ có những yêu cầu phức tạp hơn nhiều, dẫn đến nhiều sự lẫn lộn khác. Tôi sẽ đề cập thêm sau này.

2 nhận xét: