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

Я хочу удалить из таблицы записи, в которых есть несколько значений для поля Дата.

Так скажи, у меня есть Employee table - Id,Name,Date,Points

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

Может кто-нибудь предложить запрос на обновление, чтобы сделать это?

Ответы [ 4 ]

4 голосов
/ 24 июня 2010

Использование:

DELETE FROM EMPLOYEE
 WHERE id NOT IN (SELECT MAX(e.id)
                    FROM EMPLOYEE e
                   WHERE e.date = date
                GROUP BY e.date)

Скорее всего GROUP BY не требуется из-за предложения WHERE и возвращает только один столбец с агрегатной функцией, но он включен для безопасности.Предполагается, что когда OP сообщает поле даты, то есть SQL Server 2008 означает тип данных DATE , а не DATETIME .

2 голосов
/ 24 июня 2010

этот запрос просматривает записи с одинаковыми идентификатором, именем и точками и удаляет все, кроме самой последней

with cte as(
    select id,Name, Date, Points,row_number() over(
       partition by id,name,points order by date desc) as ind
    from emp)

    delete from cte where ind>1
1 голос
/ 24 июня 2010

Если ваша таблица имеет первичный ключ, вы можете присоединить таблицу к себе по условию dup и отфильтровать большие PK, что-то вроде следующего:

delete e2
from Employee e
join Employee e2 on e.Date=e2.Date
where e.ID < e2.ID
0 голосов
/ 24 июня 2010

вы можете использовать

DELETE
From Employee 
WHERE ID not in (select max(ID) from Employee group by Name)

если последняя запись является последней датой, или вы можете использовать этот код

DELETE
From Employee 
WHERE ID not in 
(select max(ID) from Employee e1 
where Date=(select max(Date) From Employee where Name=e1.Name) 
group by Name)
...