sql >> Databasteknik >  >> RDS >> Sqlserver

Använder SQL Merge eller 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;

Detta tar hand om flera rader i källtabellen som inte redan finns i destinationen. Jag har gjort ett antagande om kolumnnamn som du måste justera.

MERGE kan vara frestande, men det finns några anledningar till att jag drar mig för det:

  1. syntaxen är skrämmande och svår att memorera...
  2. du inte får inte mer samtidighet än ovanstående tillvägagångssätt om du inte avsiktligt lägger till specifika låstips ...
  3. det finns många olösta buggar med MERGE och förmodligen många fler som ännu inte har avslöjats...

Jag publicerade nyligen ett varningstips här också och har samlat några andra åsikter här .




  1. MySQL frågar efter flera tabeller

  2. Ställa in sessionens tidszon med spring jdbc oracle

  3. Entity Framework Code-Först för långsam vid start

  4. Hur man returnerar Unix-tidsstämpeln i SQL Server (T-SQL)