Considere uma coluna chamada EmployeeName
tabela Employee
. O objetivo é excluir registros repetidos, com base no EmployeeName
campo.
EmployeeName
------------
Anand
Anand
Anil
Dipak
Anil
Dipak
Dipak
Anil
Usando uma consulta, desejo excluir os registros que se repetem.
Como isso pode ser feito com TSQL no SQL Server?
sql
tsql
duplicates
delete-row
usr021986
fonte
fonte
empId
coluna em seu exemplo usada por John?row_number() over (partition by EmployeeName order by EmployeeName)
... isso escolheria um único registro arbitrário para cada nome .Respostas:
Você pode fazer isso com funções de janela. Ele ordenará os duplicados por empId e excluirá todos, exceto o primeiro.
Execute-o como um select para ver o que seria excluído:
fonte
ORDER BY (SELECT NULL)
stackoverflow.com/a/4812038Supondo que sua tabela Employee também tenha uma coluna exclusiva (
ID
no exemplo abaixo), o seguinte funcionará:Isso deixará a versão com o ID mais baixo na tabela.
Editar
o comentário de Re McGyver - a partir do SQL 2012
Para 2008 R2 e anterior,
Para 2008R2, você precisará converter o
GUID
para um tipo compatívelMIN
, por exemplo,SqlFiddle para vários tipos no Sql 2008
SqlFiddle para vários tipos no Sql 2012
fonte
Você pode tentar algo como o seguinte:
(isso pressupõe que você tem um campo exclusivo baseado em número inteiro)
Pessoalmente, porém, diria que seria melhor você tentar corrigir o fato de que entradas duplicadas estão sendo adicionadas ao banco de dados antes que ocorra, em vez de como uma operação pós-correção.
fonte
fonte
A magia das expressões de mesa comuns.
fonte
Experimentar
fonte
Se você está procurando uma maneira de remover duplicatas, mas tem uma chave estrangeira apontando para a tabela com duplicatas, você pode seguir a seguinte abordagem usando um cursor lento, mas eficaz.
Ele irá realocar as chaves duplicadas na tabela de chaves estrangeiras.
fonte
fonte
Por favor, veja a forma de exclusão abaixo também.
Criou uma tabela de amostra chamada
@Employee
e carregou-a com os dados fornecidos.Resultado:
Eu sei, isso é perguntado há seis anos, postar apenas no caso de ser útil para qualquer pessoa.
fonte
Esta é uma boa maneira de desduplicar registros em uma tabela que possui uma coluna de identidade baseada em uma chave primária desejada que você pode definir em tempo de execução. Antes de começar, vou preencher um conjunto de dados de amostra para trabalhar com o seguinte código:
Em seguida, criarei um tipo chamado ColumnNames:
Finalmente, criarei um proc armazenado com as três seguintes advertências: 1. O proc terá um parâmetro obrigatório @tablename que define o nome da tabela que você está excluindo do banco de dados. 2. O proc tem um parâmetro opcional @columns que você pode usar para definir os campos que constituem a chave primária desejada que você está excluindo. Se este campo for deixado em branco, presume-se que todos os campos além da coluna de identidade constituem a chave primária desejada. 3. Quando registros duplicados são excluídos, o registro com o menor valor em sua coluna de identidade será mantido.
Aqui está meu procedimento armazenado delete_dupes:
Uma vez que isso seja cumprido, você pode deletar todos os seus registros duplicados executando o proc. Para excluir ingênuos sem definir uma chave primária desejada, use esta chamada:
Para excluir ingênuos com base em uma chave primária desejada definida, use esta chamada:
fonte