Удаление дубликатов записей с использованием только одного запроса - PullRequest
7 голосов
/ 16 марта 2011

Я использую SQL Server 2005.

У меня есть такая таблица -

ID    Name
1      a
1      a
1      a
2      b
2      b
3      c
4      d
4      d

В этом я хочу удалить все дублирующиеся записи и сохранить только один экземпляр как -

ID     Name
1       a
2       b
3       c
4       d

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

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

Ответы [ 5 ]

9 голосов
/ 16 марта 2011

Использование ROW_NUMBER в CTE позволяет удалять повторяющиеся значения при сохранении уникальных строк.

WITH q AS (
  SELECT RN = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID )
         , ID
         , Name
  FROM   ATable
)
DELETE FROM q WHERE RN > 1
1 голос
/ 21 ноября 2013

Вы можете использовать этот запрос:

delete a from
(select id,name, ROW_NUMBER() over (partition by id,name order by id) row_Count
from dup_table) a
where  a.row_Count >1
1 голос
/ 13 февраля 2012

Lieven - Право ... однако вы можете изменить код Ливена, просто добавив предложение top в операторе delete, например так:

delete top (1) из q, где RN> 1;

Надеюсь, это поможет

0 голосов
/ 16 марта 2011
DELETE FROM tbl
WHERE ID NOT IN (
    SELECT MIN(ID)
    FROM tbl
    GROUP BY Name
)
0 голосов
/ 16 марта 2011
delete from table1
USING table1, table1 as vtable
WHERE (NOT table1.ID=vtable.ID)
AND (table1.Name=vtable.Name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...