Si vous utilisez SQL Server 2005 ou version ultérieure (et les balises de votre question indiquent SQL Server 2008), vous pouvez utiliser des 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 le montre en action, où il 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
Notez 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 n'avez pas de colonne disponible pour classer les enregistrements dans un groupe, vous pouvez utiliser les colonnes partitionnées comme colonnes de classement.