Se você estiver usando o SQL Server 2005 ou posterior (e as tags da sua pergunta indicarem o SQL Server 2008), poderá usar as funções de classificação para retornar os registros duplicados após o primeiro, se o uso de junções for menos desejável ou impraticável por algum motivo. O exemplo a seguir mostra isso em ação, onde também trabalha com valores nulos nas colunas examinadas.
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
Observe depois de executar este exemplo que o primeiro registro de cada "grupo" é excluído e que os registros com valores nulos são tratados corretamente.
Se você não tiver uma coluna disponível para ordenar os registros em um grupo, poderá usar as colunas de partição por como as colunas de ordenação.