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;
Dette tager sig af flere rækker i kildetabellen, som ikke allerede findes i destinationen. Jeg har lavet en antagelse om kolonnenavne, som du bliver nødt til at justere.
MERGE
kan være fristende, men der er et par grunde til, at jeg viger tilbage fra det:
- syntaksen er skræmmende og svær at huske...
- du ikke får ikke mere samtidighed end ovenstående fremgangsmåde, medmindre du med vilje tilføjer specifikke låsetip ...
- der er mange uløste fejl med
MERGE
og sikkert mange flere, der endnu ikke er blevet afsløret...
Jeg har for nylig offentliggjort et advarselstip også her og har samlet nogle andre meninger her .