Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Usando 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;

Isso cuida de várias linhas na tabela de origem que ainda não existem no destino. Eu fiz uma suposição sobre os nomes das colunas que você terá que ajustar.

MERGE pode ser tentador, no entanto, existem algumas razões pelas quais eu evito isso:
  1. a sintaxe é assustadora e difícil de memorizar...
  2. você não 'não obtém mais simultaneidade do que a abordagem acima, a menos que você adicione intencionalmente dicas de bloqueio específicas ...
  3. há muitos bugs não resolvidos com MERGE e provavelmente muitos mais que ainda precisam ser descobertos...

Recentemente publiquei uma dica de advertência aqui também e coletou algumas outras opiniões aqui .