Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sử dụng SQL Merge hoặc UPDATE / INSERT

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ó:

  1. cú pháp khó nhớ và khó ghi nhớ ...
  2. 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ể ...
  3. 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 đã thu thập một số ý kiến ​​khác tại đây .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tsql:Cách truy xuất ngày cuối cùng của mỗi tháng giữa phạm vi ngày nhất định

  2. Microsoft Access so với SQL Server

  3. Giá trị rõ ràng cho cột nhận dạng trong bảng chỉ có thể được chỉ định khi danh sách cột được sử dụng và IDENTITY_INSERT BẬT SQL Server

  4. Kiểm tra xem một ngày nhất định có phù hợp với một phạm vi ngày không

  5. Chuyển đổi bộ kết quả SQL