sql >> Base de Datos >  >> RDS >> Sqlserver

Usando SQL Merge o ACTUALIZAR / INSERTAR

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;

Esto se ocupa de varias filas en la tabla de origen que aún no existen en el destino. He hecho una suposición sobre los nombres de las columnas que tendrá que ajustar.

MERGE puede ser tentador, sin embargo, hay algunas razones por las que lo evito:

  1. la sintaxis es desalentadora y difícil de memorizar...
  2. no no obtendrá más simultaneidad que el enfoque anterior a menos que agregue intencionalmente sugerencias de bloqueo específicas ...
  3. hay muchos errores no resueltos con MERGE y probablemente muchos más que aún no se han descubierto...

Recientemente publiqué un consejo de advertencia aquí también y han recopilado algunas otras opiniones aquí .