Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Menggunakan SQL Merge atau 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;

Ini menangani beberapa baris di tabel sumber yang belum ada di tujuan. Saya telah membuat asumsi tentang nama kolom yang harus Anda sesuaikan.

MERGE mungkin menggoda, namun ada beberapa alasan mengapa saya menghindarinya:

  1. sintaksnya menakutkan dan sulit untuk dihafal...
  2. Anda tidak 'tidak mendapatkan konkurensi lebih dari pendekatan di atas kecuali jika Anda sengaja menambahkan petunjuk penguncian tertentu ...
  3. ada banyak bug yang belum terselesaikan dengan MERGE dan mungkin masih banyak lagi yang belum terungkap...

Baru-baru ini saya menerbitkan tip peringatan di sini juga dan telah mengumpulkan beberapa pendapat lain di sini .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2005 - Error_Message() tidak menampilkan pesan lengkap

  2. Dapatkan perbedaan waktu antara kelompok catatan

  3. Menanyakan nilai terenkripsi dalam database

  4. CAST(DATETIME AS DATE) melalui klausa WHERE

  5. Cara membaca beberapa set hasil yang dikembalikan dari prosedur tersimpan SQL Server di R