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:
- syntaxen är skrämmande och svår att memorera...
- du inte får inte mer samtidighet än ovanstående tillvägagångssätt om du inte avsiktligt lägger till specifika låstips ...
- 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 .