sql >> Database >  >> RDS >> Sqlserver

SQL Merge of UPDATE / INSERT gebruiken

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:

  1. de syntaxis is ontmoedigend en moeilijk te onthouden...
  2. je doneert krijg niet meer gelijktijdigheid dan de bovenstaande benadering, tenzij u opzettelijk specifieke vergrendelingshints toevoegt ...
  3. 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 .




  1. Herschik de databaserecordrijen via front-end met behulp van php

  2. RDS-snapshot downloaden

  3. Hoe werkt Subquery in select-instructie in Oracle?

  4. Mijn VARCHAR(MAX)-veld beperkt zichzelf tot 4000; wat geeft?