#sql #sql-server #insert #merge #duplicates
#sql #sql-server #вставить #слияние #дубликаты
Вопрос:
Что мне нужно сделать
- Если повторяющаяся строка существует, не вставляйте.
- Если существует тот же 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]);