Удаление дубликатов перед вставкой в ​​базу данных - PullRequest
2 голосов
/ 10 февраля 2012

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

Я подумываю использовать левое внешнее соединение, чтобы определить, какие строки являются дубликатами, но тогда как я могу пойти и удалить эти строки из моей временной таблицы?

Правильный ли я подход, или было бы лучше удалить дубликаты после передачи данных?

1 Ответ

2 голосов
/ 10 февраля 2012

Предполагая, что на col1 / col2 есть индекс, это может работать лучше, чем попытка отсеять дубликаты в процессе вставки:

DELETE t
FROM #temp AS t
WHERE NOT EXISTS
(
  SELECT 1 FROM dbo.table
    WHERE col1 = t.col1
    AND col2 = t.col2
);

Эквивалентом подхода Джека будет:

INSERT dbo.table(col1, col2)
SELECT col1, col2
FROM #temp AS t
WHERE NOT EXISTS
(
  SELECT 1 FROM dbo.table
    WHERE col1 = t.col1
    AND col2 = t.col2
);

Я предполагаю, что у вас есть уникальный индекс в таблице #temp, поэтому вам не нужны DISTINCT или GROUP BY. Вы также можете сначала удалить дубликаты из таблицы #temp как отдельный шаг, например,

;WITH t AS 
(
  SELECT col1, col2, 
    rn = ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY col1)
)
DELETE t WHERE rn > 1;

Делаете ли вы правильные вещи или нет, не знаю. Потребуется намного больше информации и тестирования, чтобы определить, какой подход лучше. Вам придется сканировать более 2 миллионов строк на наличие дубликатов, независимо от того, какой метод вы в итоге используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...