2010-06-23 14 views
0

Je souhaite supprimer d'une table les entrées contenant plusieurs valeurs pour le champ Date.Comment supprimer des valeurs en double pour un champ dans une table avec une seule requête?

dire donc je Employee table - Id,Name,Date,Points

Je veux supprimer les entrées avec un même champ Date qui doit être unique ... juste pour le nettoyage je dois juste garder une seule entrée pour la date et supprimer le reste .. .maybe garder le plus récent si possible ....

Quelqu'un peut-il s'il vous plaît suggérer une requête mise à jour pour ce faire?

+1

Que voulez-vous garder - l'enregistrement avec la valeur ID la plus élevée ou la plus basse? –

+0

@OMG Poneys Je veux que l'enregistrement de date récente soit conservé – Vishal

+0

est l'id le PK? –

Répondre

4

Utilisation:

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

Le GROUP BY n'est probablement pas nécessaire en raison de la clause WHERE & renvoyant uniquement une colonne avec une fonction d'agrégat, mais elle est incluse pour être sûre. C'est en supposant que lorsque l'OP dit champ date, étant SQL Server 2008 qui signifie le DATE data type, pas DATETIME.

+0

Etes-vous sûr de ne pas avoir besoin d'un alias de table pour faire référence à l'employé de la requête externe? (Autrement dit, 'date' ne sera-t-il pas interprété de façon incorrecte comme signifiant 'e.date'?) – meriton

+0

@meriton: S'il n'y a pas d'alias de table, les colonnes sans alias sont supposées être attachées à cette table. L'aliasing de la table principale à une instruction delete n'est pas systématiquement supporté, donc je ne le fais pas par habitude. –

+0

Je vois, bon à savoir :) – meriton

1

Si votre table est clé primaire, vous pouvez rejoindre la table elle-même par la condition dup et filtrent plus PKS quelque chose comme ce qui suit:

delete e2 
from Employee e 
join Employee e2 on e.Date=e2.Date 
where e.ID < e2.ID 
0

vous pouvez utiliser

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

si la dernière entrée est la date récente, ou vous pouvez utiliser ce code

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) 
2

cette requête porte sur les enregistrements avec la même Id, le nom et les points et les suppressions tout sauf la dernière

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