Удалить повторяющиеся строки - PullRequest
3 голосов
/ 29 мая 2011

У меня есть таблица, которая выглядит следующим образом

Table1

Id, Имя

Как мне написать запрос, который удалит все строки с повторяющимися именами, но оставит один с более низким Id?

Ответы [ 3 ]

4 голосов
/ 29 мая 2011

Если вы используете SQL Server 2005 или более позднюю версию:

With Dups As
    (
    Select Id, Name
        , Row_Number() Over ( Partition By Name Order By Id ) As Num
    From Table1
    )
Delete Table1
Where Id In (
            Select Id
            From Dups
            Where Num > 1
            )

При использовании SQL Server 2000 и более ранних версий

Delete Table1
Where Exists    (
                Select 1
                From Table1 As T1
                Where T1.Name = Table1.Name
                Having Min( T1.Id ) <> Table1.Id
                )
2 голосов
/ 29 мая 2011

Дубликаты могут быть удалены с помощью простого запроса самостоятельного объединения.Приведенный ниже скрипт поможет вам.

delete t2
from Table1 t1
join Table1 t2
   on t1.Name = t2.Name
where t1.Id < t2.Id

Эта логика может использоваться в тех случаях, когда необходимо удалить дубликаты.Мы должны избегать «курсора» настолько, насколько это возможно, поскольку он блокирует таблицу.

0 голосов
/ 29 мая 2011

Просто вы можете сделать это с помощью курсоров, запрос может выглядеть следующим образом:

объявить @id int объявить @name nvarchar (30)

объявить курсор cr для выбора идентификатора, имени из idnametblупорядочить по идентификатору

для обновления

открыть cr

извлечь следующий из cr в @ id, @ name

while @@ fetch_status = 0

begin

удалить из idnametbl, где id> @id и name = @ name

извлечь следующий из cr в @ id, @ name

end

закрыть кр

освободить кр

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