Si vous utilisez SQL Server 2005 ou une version ultérieure (et que les balises de votre question indiquent SQL Server 2008), vous pouvez utiliser les fonctions de classement pour renvoyer les enregistrements en double après le premier si l'utilisation de jointures est moins souhaitable ou peu pratique pour une raison quelconque. L'exemple suivant montre cela en action, où cela fonctionne également avec des valeurs nulles dans les colonnes examinées.
create table Table1 (
Field1 int,
Field2 int,
Field3 int,
Field4 int
)
insert Table1
values (1,1,1,1)
, (1,1,1,2)
, (1,1,1,3)
, (2,2,2,1)
, (3,3,3,1)
, (3,3,3,2)
, (null, null, 2, 1)
, (null, null, 2, 3)
select *
from (select Field1
, Field2
, Field3
, Field4
, row_number() over (partition by Field1
, Field2
, Field3
order by Field4) as occurrence
from Table1) x
where occurrence > 1
Remarquez après avoir exécuté cet exemple que le premier enregistrement de chaque "groupe" est exclu, et que les enregistrements avec des valeurs nulles sont traités correctement.
Si vous ne disposez pas d'une colonne pour ordonner les enregistrements d'un groupe, vous pouvez utiliser les colonnes partition-by comme colonnes order-by.
3 votes
Votre pseudo code est ambigu, de plus vous ne définissez pas l'ordre selon lequel vous ne voulez pas le premier. je vous suggère de donner un exemple de données.