sql >> Database teknologi >  >> RDS >> Sqlserver

Brug af SQL Merge eller UPDATE / INSERT

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:

  1. syntaksen er skræmmende og svær at huske...
  2. du ikke får ikke mere samtidighed end ovenstående fremgangsmåde, medmindre du med vilje tilføjer specifikke låsetip ...
  3. 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 .




  1. Arrayed input-værdi indsætter tom post i mysql

  2. Sådan bestiller du resultater af en forespørgsel tilfældigt og vælger tilfældige rækker. (MySQL)

  3. Skal jeg bruge Oracles UCP eller HikariCP til en moderne applikation?

  4. Hvad er den bedste måde at indsætte flere rækker i PHP PDO MYSQL?