Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utilisation de SQL Merge ou 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;

Cela prend en charge plusieurs lignes dans la table source qui n'existent pas déjà dans la destination. J'ai fait une hypothèse sur les noms de colonnes que vous devrez ajuster.

MERGE peut être tentant, mais il y a quelques raisons pour lesquelles j'hésite :

  1. la syntaxe est intimidante et difficile à mémoriser...
  2. vous ne n'obtenez pas plus de simultanéité que l'approche ci-dessus à moins que vous n'ajoutiez intentionnellement des conseils de verrouillage spécifiques ...
  3. il existe de nombreux bogues non résolus avec MERGE et probablement bien d'autres encore à découvrir...

J'ai récemment publié une mise en garde ici aussi et ont recueilli d'autres avis ici .