Как я могу сравнить две таблицы и удалить повторяющиеся строки в SQL?

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

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


person zSynopsis    schedule 27.02.2009    source источник


Ответы (5)


Что ж, в какой-то момент вам придется проверить все столбцы — возможно, вы присоединитесь...

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(*), но это только помогает - вам все равно нужно проверять фактические значения, чтобы исключить конфликты хэшей.

person Marc Gravell    schedule 27.02.2009
comment
Это хорошо работает, пока ни один из столбцов не содержит пустых значений. Как только это произойдет, вы должны начать возиться со сложными условиями, такими как (a.Name = b.Name OR (a.Name IS NULL AND b.Name IS NULL)) для каждого столбца, допускающего значение NULL. Еще одна причина избегать нулей. - person Jonathan Leffler; 02.03.2009
comment
@Marc Gravell, если таблица a и таблица b присутствуют в файле view. Тогда как я могу удалить повторяющиеся строки и сохранить оригинал один раз? Я разместил [stackoverflow.com/questions/32065340/ в такой ситуации. - person MAK; 18.08.2015
comment
Использование INTERSECT и EXCEPT (см. другой ответ) для этих типов операций позволяет избежать проблемы NULL sqlblog.com/blogs/paul_white/archive/2011/06/22/ - person rpisryan; 04.05.2016

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

delete * from table1 intersect select * from table2
person Chris Van Opstal    schedule 27.02.2009

Я думаю, что приведенный ниже псевдокод сделает это.

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

Сообщение Криса INTERSECT гораздо более элегантно, и я буду использовать его в будущем вместо того, чтобы выписывать все критерии внешнего соединения :)

person Rich Andrews    schedule 27.02.2009

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

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

person Gthompson83    schedule 27.02.2009

попробуй это:

DELETE t1 FROM t1 INNER JOIN t2 ON t1.name = t2.name WHERE t1.id = t2.id
person Leebeedev    schedule 05.09.2016