Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Utilizzando SQL Merge o 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;

Questo si occupa di più righe nella tabella di origine che non esistono già nella destinazione. Ho fatto un'ipotesi sui nomi delle colonne che dovrai modificare.

MERGE potrebbe essere allettante, tuttavia ci sono alcuni motivi per cui evito di farlo:

  1. la sintassi è scoraggiante e difficile da memorizzare...
  2. non non ottieni più concorrenza rispetto all'approccio precedente a meno che tu non aggiunga intenzionalmente suggerimenti di blocco specifici ...
  3. ci sono molti bug irrisolti con MERGE e probabilmente molti altri ancora da scoprire...

Ho recentemente pubblicato un suggerimento cautelativo anche qui e hanno raccolto altre opinioni qui .