2009-02-27 4 views
6

У меня есть две таблицы, и мне нужно удалить строки из первой таблицы, если во второй таблице существует точная копия строки.Как сравнить две таблицы и удалить повторяющиеся строки в SQL?

Есть ли у кого-нибудь пример того, как я буду делать это на сервере MSSQL?

ответ

8

Ну, в какой-то момент вы будете иметь, чтобы проверить все столбцы - могли бы также получить присоединение ...

DELETE a 
FROM a -- first table 
INNER JOIN b -- second table 
     ON b.ID = a.ID 
     AND b.Name = a.Name 
     AND b.Foo = a.Foo 
     AND b.Bar = a.Bar 

Это должно сделать это ... есть также CHECKSUM(*), но это только помогает - вам все равно нужно проверить фактические значения, чтобы исключить хэш-конфликты.

+5

Это прекрасно работает до тех пор, как ни один из столбцов не содержит нули. Как только это произойдет, вы должны начать возиться со сложными условиями, такими как (a.Name = b.Name OR (a.Name IS NULL AND b.Name IS NULL)) для каждого столбца с нулевым значением. Еще одна причина избегать нулей. –

+0

@Marc Gravell, Если в 'view' присутствует таблица' a' и таблица 'b'. Тогда как я могу удалить повторяющиеся строки и сохранить оригинал один раз? Я разместил [http://stackoverflow.com/questions/32065340/sql-server-2008-r2-delete-duplicate-rows-from-tables-containing-in-view/32065972?noredirect1_comment52032907_32065972] на таких ситуация. – MAK

+0

Использование INTERSECT и EXCEPT (см. Другой ответ) для этих типов операций позволяет избежать проблемы с NULL. Http://sqlblog.com/blogs/paul_white/archive/2011/06/22/undocumented-query-plans-equality-comparisons.aspx – ryascl

1

Я думаю, что ниже psuedocode бы это сделать ..

DELETE FirstTable, SecondTable 
FROM FirstTable 
FULL OUTER JOIN SecondTable 
ON FirstTable.Field1 = SecondTable.Field1 
... continue for all fields 
WHERE FirstTable.Field1 IS NOT NULL 
AND SecondTable.Field1 IS NOT NULL 

ПЕРЕСЕЧЕНИЕ пост Криса гораздо более изящным, хотя и я буду использовать это в будущем вместо того, чтобы выписывать все внешнее объединение критериев :)

0

Я бы попробовал запрос DISTINCT и сделал объединение двух таблиц.

Вы можете использовать язык сценариев, такой как asp/php, для форматирования вывода в ряд операторов вставки, чтобы перестроить таблицу результирующими уникальными данными.

8

Если вы используете SQL Server 2005, вы можете использовать intersect:

delete * from table1 intersect select * from table2 
0

попробовать это:

DELETE t1 FROM t1 INNER JOIN t2 ON t1.name = t2.name WHERE t1.id = t2.id