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;
Това се грижи за множество редове в изходната таблица, които все още не съществуват в дестинацията. Направих предположение относно имената на колоните, които ще трябва да коригирате.
MERGE
може да е изкушаващо, но има няколко причини да избягвам това:
- синтаксисът е плашещ и труден за запомняне...
- не не получавате повече едновременност от горния подход, освен ако умишлено не добавите конкретни съвети за заключване ...
- има много неразрешени грешки с
MERGE
и вероятно много други, които все още не са разкрити...
Наскоро публикувах предупредителен съвет и тук и са събрали някои други мнения тук .