Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Korzystanie z SQL Merge lub 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 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:

  1. składnia jest zniechęcająca i trudna do zapamiętania...
  2. nie nie uzyskaj więcej współbieżności niż powyższe podejście, chyba że celowo dodasz konkretne wskazówki dotyczące blokowania ...
  3. 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 .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zmień typ kolumny z liczbami z varchar na int

  2. SQL Server — czy [SELECT] blokuje [UPDATE]?

  3. Wyrażenie zmiennej IN w SQL

  4. Jak mogę zoptymalizować/refaktoryzować klauzulę TSQL LIKE?

  5. sp_executesql powoduje, że moje zapytanie jest bardzo powolne