запрос на удаление повторяющихся записей из таблицы без использования временной таблицы? - PullRequest
0 голосов
/ 07 августа 2010

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

Ответы [ 5 ]

4 голосов
/ 07 августа 2010
  1. Создайте запрос A, в котором вы получите строки, которые квалифицируются как дубликаты
  2. Создайте запрос B, который вернет вам строки, которые вы хотите сохранить
  3. Сделать запрос, который удаляет все строки, которые находятся в A, но не в B.

Пример.

Предполагается, что таблица с именем table со столбцом идентификатора автоинкремента с именем id и столбцом с именем name, из которого вы хотите удалить двойные числа. Из каждого имени вы хотите сохранить самую старую запись (ту, у которой самый низкий идентификатор).

Запрос A выглядит примерно так:

SELECT * FROM table 
WHERE name IN (SELECT name FROM table GROUP BY name HAVING COUNT(*) > 1)

Запрос B будет:

SELECT * FROM table 
WHERE id IN (SELECT min(id) FROM table GROUP BY name)

Теперь объедините их, чтобы сформировать запрос на удаление:

DELETE FROM table 
WHERE name IN (SELECT name FROM table GROUP BY name HAVING COUNT(*) > 1)
AND NOT id IN (SELECT min(id) FROM table GROUP BY name)

В данном примере вы могли бы пропустить первый запрос, но когда все усложняется, это хорошая дополнительная защита.

1 голос
/ 07 августа 2010

Вы не можете. Полностью повторяющиеся записи (те, у которых все поля равны) не могут быть удалены одной, потому что вы не можете различить их в предложении Where в запросе на удаление.
Единственным способом будетсделать запрос select distinct, чтобы выбрать все строки без дубликатов, а затем вставить их в пустую таблицу.

Если у вас нет полностью дублированных записей, тогда вопрос сформулирован неправильно, и вы неЯ не хочу удалять дубликаты записей, потому что их нет.Строки с неполным набором равных полей не являются дубликатами.В этом случае вы захотите удалить строки с равными полями, и в этом случае вам нужно будет указать, какие из них оставить, если определенное поле или набор полей не равен.

0 голосов
/ 26 апреля 2018

/ * Если в таблице есть повторяющиеся строки, то вы можете использовать этот запрос * /

/ * Вы можете использовать любую функцию ранга Row_Number (), Rank () и Dense_Rank () будут одинаковыми * /

УДАЛИТЬ ОТ Сотрудника E ПРИСОЕДИНИТЬСЯ ( ВЫБРАТЬ ИЗ ( SELECT ROW_NUMBER () OVER (PARTITION BY Name ORDER BY ID) в качестве RowNo, id, Name from Employee) X где X.RowNo = 2) X On E.ID = E.ID

0 голосов
/ 03 ноября 2015

Я думаю, что этот запрос будет работать правильно:

delete from table where id in (select count(*)c from table group by id having c > 1)
0 голосов
/ 09 августа 2010

Вы можете сделать это без проблем, используя общее табличное выражение (CTE), вам вообще не нужно использовать какие-либо временные таблицы. Просто будьте осторожны, если удаление идет против таблицы с высоким трафиком. Удаление больших объемов данных может привести к блокировке и блокировке, а также к журналу транзакций.

Примечание. Этот код был написан без какого-либо тестирования, но должен работать (SQL 2005 и выше).

/* Create test data with duplicates */
declare @TestTable Table (Col1 int)

insert into @TestTable

select 1 union all
select 1 union all
select 2 union all
select 3 union all
select 3 union all
select 4
;
/* Create CTE to number all duplicates (gives a running number to all identical values in Col1) */
with FindDupes as
(
Select Col1,ROW_NUMBER() over (partition by Col1 order by Col1) RN

from @TestTable
)
/* Delete the duplicates (anything that has a higher rownumber than one) */
Delete from FindDupes where RN>1
;

/* Select the remaining data from the table */
Select * from @TestTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...