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;
To zajmuje się wieloma wierszami w tabeli źródłowej, które jeszcze nie istnieją w miejscu docelowym. Zrobiłem założenie dotyczące nazw kolumn, które należy dostosować.
MERGE
może być kusząca, ale jest kilka powodów, dla których się tego unikam:
- składnia jest zniechęcająca i trudna do zapamiętania...
- nie nie uzyskaj więcej współbieżności niż powyższe podejście, chyba że celowo dodasz konkretne wskazówki dotyczące blokowania ...
- jest wiele nierozwiązanych błędów z
MERGE
i prawdopodobnie wiele innych, które jeszcze nie zostały odkryte...
Niedawno opublikowałem ostrzeżenie tutaj też i zebrali tutaj kilka innych opinii .