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 se postará o více řádků ve zdrojové tabulce, které v cíli ještě neexistují. Udělal jsem předpoklad o názvech sloupců, které budete muset upravit.
SLOUČIT
může to být lákavé, nicméně existuje několik důvodů, proč se tomu vyhýbam:
- syntaxe je skličující a těžko zapamatovatelná...
- neděláte nezískáte více souběžnosti než výše uvedený přístup, pokud záměrně nepřidáte konkrétní tipy na zamykání ...
- v
SLOUČIT
a pravděpodobně mnoho dalších, které ještě nebyly odhaleny...
Nedávno jsem zveřejnil varovný tip také zde a zde shromáždili nějaké další názory .