Условие, чтобы избежать повторяющейся вставки в SQL SERVER

#sql #sql-server #insert #merge #duplicates

#sql #sql-server #вставить #слияние #дубликаты

Вопрос:

Что мне нужно сделать

  1. Если повторяющаяся строка существует, не вставляйте.
  2. Если существует тот же party_num, но другие столбцы имеют другое значение, обновите существующие значения других столбцов для этого номера участника.

Каков наилучший способ сделать это, поскольку исходная и целевая таблицы содержат более 500 тыс. записей?

  INSERT INTO STAGING_CUST_ACCT

        SELECT 
            [CUSTOMER KEY]      AS [PARTY_NUM]
            ,[ACCOUNT CITY]             AS [PRIMARY CITY]
            ,[ACCOUNT STATE]            AS [PRIMARY STATE]
            ,[ACCOUNT ZIP]              AS [PRIMARY ZIP]
        FROM [RCC_CLOSED]  
  

Ответ №1:

 ;
WITH changed_rows_only AS (
    SELECT [CUSTOMER KEY],[ACCOUNT CITY],[ACCOUNT STATE],[ACCOUNT ZIP] FROM RCC_CLOSED
    EXCEPT
    SELECT [PARTY_NUM]   ,[PRIMARY CITY],[PRIMARY STATE],[PRIMARY ZIP] FROM STAGING_CUST_ACCT
)
MERGE INTO STAGING_CUST_ACCT AS tgt
USING changed_rows_only AS src
ON (
  src.[CUSTOMER KEY] = tgt.[CUSTOMER KEY]
)
WHEN MATCHED THEN UPDATE SET
  tgt.[PRIMARY CITY]  = src.[ACCOUNT STATE]
 ,tgt.[PRIMARY STATE] = src.[ACCOUNT STATE]
 ,tgt.[PRIMARY ZIP]   = src.[ACCOUNT ZIP]
WHEN NOT MATCHED THEN
  INSERT(    [PARTY_NUM]   ,    [PRIMARY CITY],    [PRIMARY STATE],    [PRIMARY ZIP])
  VALUES(src.[CUSTOMER KEY],src.[ACCOUNT CITY],src.[ACCOUNT STATE],src.[ACCOUNT ZIP]);