Ví dụ sau sử dụng T-SQL để hợp nhất hai bảng trong SQL Server. Nó sử dụng VALUES
hàm tạo giá trị bảng làm bảng nguồn.
Giả sử chúng ta tạo một bảng như sau:
CREATE TABLE Idiots (
IdiotId int IDENTITY(1,1) NOT NULL,
FirstName varchar(50),
LastName varchar(50)
);
INSERT INTO Idiots VALUES
('Peter', 'Griffin'),
('Homer', 'Simpson'),
('Ned', 'Flanders');
SELECT * FROM Idiots;
Kết quả:
+-----------+-------------+------------+ | IdiotId | FirstName | LastName | |-----------+-------------+------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Flanders | +-----------+-------------+------------+
Và giả sử chúng ta muốn thực hiện thao tác hợp nhất. Chúng tôi muốn chèn các hàng mới, nhưng nếu một hàng đã tồn tại với các giá trị khớp với các giá trị trong nguồn của chúng tôi, thì chúng tôi muốn cập nhật hàng hiện có thay thế (thay vì chèn một hàng mới).
Chúng ta có thể làm như thế này:
DECLARE @Changes TABLE(Change VARCHAR(20));
MERGE INTO Idiots AS Target
USING ( VALUES
(3, 'Ned', 'Okily Dokily!'),
(4, 'Lloyd','Christmas'),
(5, 'Harry', 'Dunne')
) AS Source ( IdiotId, FirstName, LastName )
ON Target.IdiotId = Source.IdiotId
AND Target.FirstName = Source.FirstName
WHEN MATCHED THEN
UPDATE SET FirstName = Source.FirstName, LastName = Source.LastName
WHEN NOT MATCHED BY TARGET THEN
INSERT (FirstName, LastName) VALUES (Source.FirstName, Source.LastName)
OUTPUT $action INTO @Changes;
SELECT Change, COUNT(*) AS Count
FROM @Changes
GROUP BY Change;
Kết quả:
+----------+---------+ | Change | Count | |----------+---------| | INSERT | 2 | | UPDATE | 1 | +----------+---------+
Hai hàng mới đã được chèn và một hàng đã được cập nhật.
Ở đây, chúng tôi đã sử dụng một hàm tạo giá trị bảng (VALUES
) để chỉ định các giá trị mới cho bảng.
Trong trường hợp này, chúng tôi đã kiểm tra IdiotId
và FirstName
cột. Về cơ bản, nếu ID và tên giống nhau, thì chúng tôi muốn cập nhật hàng hiện có thay vì chèn một hàng mới.
Chúng tôi đã sử dụng WHEN MATCHED
để chỉ định điều gì sẽ xảy ra khi dữ liệu từ VALUES
của chúng tôi mệnh đề khớp với dữ liệu trong bảng đích. Trong trường hợp này, chúng tôi chỉ cần cập nhật hàng với dữ liệu mới từ VALUES
.
Chúng tôi đã sử dụng WHEN NOT MATCHED BY TARGET
để chỉ định điều gì sẽ xảy ra khi không có kết quả phù hợp. Trong trường hợp này, chúng tôi chèn một hàng mới với dữ liệu mới.
Chúng tôi cũng đã sử dụng một biến có tên là @Changes
để xem kết quả của hoạt động hợp nhất của chúng tôi. Chúng tôi đã sử dụng OUTPUT
mệnh đề sau khi hoạt động hợp nhất cho điều này. Đó là những gì đã cung cấp cho chúng tôi bảng kết quả ở trên.
Bây giờ chúng ta có thể kiểm tra bảng mục tiêu để xem tác động của hoạt động hợp nhất đối với nó:
SELECT * FROM Idiots;
Kết quả:
+-----------+-------------+---------------+ | IdiotId | FirstName | LastName | |-----------+-------------+---------------| | 1 | Peter | Griffin | | 2 | Homer | Simpson | | 3 | Ned | Okily Dokily! | | 4 | Lloyd | Christmas | | 5 | Harry | Dunne | +-----------+-------------+---------------+
Chúng ta có thể thấy rằng tên ngốc số 3 (Ned) đã được cập nhật họ của mình. Chúng ta cũng có thể thấy rằng hai tên ngốc mới đã được thêm vào bảng (Lloyd và Harry).