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;
Dit zorgt voor meerdere rijen in de brontabel die nog niet bestaan in de bestemming. Ik heb een aanname gemaakt over kolomnamen die je moet aanpassen.
MERGE
kan verleidelijk zijn, maar er zijn een paar redenen waarom ik ervoor terugschrik:
- de syntaxis is ontmoedigend en moeilijk te onthouden...
- je doneert krijg niet meer gelijktijdigheid dan de bovenstaande benadering, tenzij u opzettelijk specifieke vergrendelingshints toevoegt ...
- er zijn veel onopgeloste bugs met
MERGE
en waarschijnlijk nog veel meer die nog moeten worden ontdekt...
Ik heb onlangs een waarschuwende tip gepubliceerd hier ook en hebben hier enkele andere meningen verzameld .