Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използване на SQL Merge или 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;

Това се грижи за множество редове в изходната таблица, които все още не съществуват в дестинацията. Направих предположение относно имената на колоните, които ще трябва да коригирате.

MERGE може да е изкушаващо, но има няколко причини да избягвам това:

  1. синтаксисът е плашещ и труден за запомняне...
  2. не не получавате повече едновременност от горния подход, освен ако умишлено не добавите конкретни съвети за заключване ...
  3. има много неразрешени грешки с MERGE и вероятно много други, които все още не са разкрити...

Наскоро публикувах предупредителен съвет и тук и са събрали някои други мнения тук .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SSRS избира резултати въз основа на списък, разделен със запетая

  2. Изчислете сумата от дата и час в HH:MM:SS в sql

  3. Проект за база данни за премахване на база данни преди внедряване?

  4. SQL рекурсивен CTE:Намиране на обекти, свързани по свойство

  5. C# Подготвени изрази - заявки със знак @ (при / знак за щрудел).