UPDATE m SET
col2 = t.col2,
col3 = t.col3 -- etc. - all columns except Customer_Number
FROM dbo.Master_File AS m
INNER JOIN
(
SELECT
Customer_Number, rn = ROW_NUMBER() OVER
(
PARTITION BY Customer_Number ORDER BY [timestamp_column] DESC
), col2, col3, ... etc ...
FROM dbo.Temp_Table
) AS t
ON m.Customer_Number = t.Customer_Number
WHERE t.rn = 1;
INSERT dbo.Master_File(Customer_Number, col2, col3, ...etc...)
SELECT Customer_Number, col2, col3, ...etc...
FROM
(
SELECT
Customer_Number, rn = ROW_NUMBER() OVER
(
PARTITION BY Customer_Number ORDER BY [timestamp_column DESC
),
col2, col3, ...etc...
FROM dbo.Temp_Table AS t
WHERE NOT EXISTS
(
SELECT 1 FROM dbo.Master_File AS m
WHERE m.Customer_Number = t.Customer_Number
)
) AS x WHERE rn = 1;
Điều này sẽ xử lý nhiều hàng trong bảng nguồn chưa tồn tại trong đích. Tôi đã đưa ra một giả định về tên cột mà bạn sẽ phải điều chỉnh.
MERGE
có thể hấp dẫn, tuy nhiên có một số lý do khiến tôi tránh xa nó:
- cú pháp khó nhớ và khó ghi nhớ ...
- bạn không không nhận được bất kỳ sự đồng thời nào hơn cách tiếp cận ở trên trừ khi bạn cố ý thêm các gợi ý khóa cụ thể ...
- có nhiều lỗi chưa được giải quyết với
MERGE
và có thể còn nhiều điều khác vẫn chưa được khám phá ...
Gần đây, tôi đã xuất bản một mẹo cảnh báo ở đây cũng vậy và đã thu thập một số ý kiến khác tại đây .