Estou testando algo no Oracle e preenchi uma tabela com alguns dados de amostra, mas no processo carreguei acidentalmente registros duplicados, agora não consigo criar uma chave primária usando algumas das colunas.
Como posso excluir todas as linhas duplicadas e deixar apenas uma delas?
sql
oracle
duplicates
delete-row
juan
fonte
fonte
De Ask Tom
(corrigido o parêntese ausente)
fonte
No DevX.com :
Onde coluna1, coluna2, etc. é a chave que você deseja usar.
fonte
fonte
Solução 1)
Solução 2)
Solução 3)
fonte
crie a tabela t2 como selecione distinto * de t1;
fonte
distinct *
aceita todos os registros que diferem em pelo menos 1 símbolo em 1 coluna. Tudo o que você precisa é selecionar valores distintos apenas das colunas que deseja criar chaves primárias - a resposta de Bill é um ótimo exemplo dessa abordagem.Você deve fazer um pequeno bloco pl / sql usando um cursor para loop e excluir as linhas que não deseja manter. Por exemplo:
fonte
Para selecionar as duplicatas, apenas o formato da consulta pode ser:
Portanto, a consulta correta conforme outra sugestão é:
Essa consulta manterá o registro mais antigo no banco de dados para os critérios escolhidos no
WHERE CLAUSE
.Associado certificado Oracle (2008)
fonte
A maneira mais rápida para mesas realmente grandes
Crie uma tabela de exceção com a estrutura abaixo: exceptions_table
Tente criar uma restrição exclusiva ou chave primária que será violada pelas duplicatas. Você receberá uma mensagem de erro porque possui duplicatas. A tabela de exceções conterá os rowids para as linhas duplicadas.
Entre na sua tabela com exceptions_table por rowid e exclua dups
Se a quantidade de linhas a excluir for grande, crie uma nova tabela (com todas as concessões e índices) que se junte a exceptions_table por rowid e renomeie a tabela original para a tabela original_dups e renomeie new_table_with_no_dups para a tabela original
fonte
Usando rowid-
Usando auto-junção
fonte
Solução 4)
fonte
1. solução
2. sloution
3. solução
4. solução
fonte
5. solução
fonte
e você também pode excluir registros duplicados de outra maneira
fonte
fonte
fonte
fonte
Para obter o melhor desempenho, eis o que escrevi:
(consulte o plano de execução)
fonte
Verifique os scripts abaixo -
1
2)
3)
Você verá aqui 6 registros.
4.run abaixo da consulta -
select * from test;
Você verá que os registros duplicados foram excluídos.
Espero que isso resolva sua consulta. Obrigado :)
fonte
Não vi respostas que usassem expressões comuns de tabela e funções de janela. É com isso que acho mais fácil trabalhar.
Algumas coisas a serem observadas:
1) Estamos apenas checando a duplicação nos campos da cláusula de partição.
2) Se você tiver algum motivo para escolher uma duplicata em detrimento de outras, poderá usar uma cláusula order by para fazer com que essa linha tenha row_number () = 1
3) Você pode alterar o número duplicado preservado alterando a cláusula where final para "Where RN> N" com N> = 1 (eu estava pensando que N = 0 excluiria todas as linhas com duplicatas, mas apenas excluiria todas as linhas) .
4) Adicionado o campo Partição de soma à consulta CTE, que marcará cada linha com o número de linhas no grupo. Portanto, para selecionar linhas com duplicatas, incluindo o primeiro item, use "WHERE cnt> 1".
fonte
fonte
solução:
fonte