sql >> Databáze >  >> RDS >> Sqlserver

Pomocí SQL Merge nebo 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;

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:

  1. syntaxe je skličující a těžko zapamatovatelná...
  2. 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í ...
  3. 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 .




  1. Porovnání běžných vzorů databázové infrastruktury

  2. Sequelize nevytváří cizí klíče jako omezení

  3. MySQL FIND_IN_SET() nefunguje podle očekávání

  4. Kde jsou v Oracle uloženy třídy Java?