Como posso excluir linhas duplicadas onde não unique row id
existem?
Minha mesa é
col1 col2 col3 col4 col5 col6 col7
john 1 1 1 1 1 1
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
sally 2 2 2 2 2 2
Quero ser deixado com o seguinte após a remoção duplicada:
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
Eu tentei algumas consultas, mas acho que elas dependem de ter um ID de linha, pois não obtenho o resultado desejado. Por exemplo:
DELETE
FROM table
WHERE col1 IN (
SELECT id
FROM table
GROUP BY id
HAVING (COUNT(col1) > 1)
)
mysql
sql
sql-server-2008
duplicates
sql-delete
Fearghal
fonte
fonte
Respostas:
Eu gosto de CTEs e,
ROW_NUMBER
como os dois combinados nos permitem ver quais linhas são excluídas (ou atualizadas), basta alterar o valorDELETE FROM CTE...
paraSELECT * FROM CTE
:DEMO (o resultado é diferente; presumo que seja devido a um erro de digitação de sua parte)
Este exemplo determina duplicatas por uma única coluna
col1
devido aoPARTITION BY col1
. Se você deseja incluir várias colunas, basta adicioná-las aoPARTITION BY
:fonte
AND COl1='John'
). Normalmente você deve aplicar o filtro no CTE....FROM dbo.Table1 WHERE Col1='John'
. Aqui está o violino: sqlfiddle.com/#!6/fae73/744/0set rowcount 1 delete from t1 where col1=1 and col2=1
visto aquiEu preferiria o CTE para excluir linhas duplicadas da tabela do servidor sql
é altamente recomendável seguir este artigo :: http://codaffection.com/sql-server-article/delete-duplicate-rows-in-sql-server/
fonte
Sem usar
CTE
eROW_NUMBER()
você pode simplesmente excluir os registros apenas usando group by withMAX
function aqui está e exemplofonte
MIN(ID)
fonte
Por favor, veja também a forma de exclusão abaixo.
Criou uma tabela de amostra chamada
@table
e carregou-a com os dados fornecidos.Nota: Se você estiver fornecendo todas as colunas da
Partition by
peça,order by
não terá muito significado.Eu sei, a pergunta foi feita há três anos e minha resposta é outra versão do que Tim postou, mas postar apenas no caso de ajuda é útil para qualquer pessoa.
fonte
Se você não tiver referências, como chaves estrangeiras, poderá fazer isso. Faço isso muito ao testar provas de conceito e os dados de teste são duplicados.
Vá para o explorador de objetos e exclua a tabela antiga.
Renomeie a nova tabela com o nome da tabela antiga.
fonte
A Microsoft tem um guia muito simples sobre como remover duplicatas. Verificação de saída http://support.microsoft.com/kb/139444
Em resumo, eis a maneira mais fácil de excluir duplicatas quando você tiver apenas algumas linhas para excluir:
myprimarykey é o identificador para a linha.
Eu configurei o número de linhas como 1 porque só tinha duas linhas duplicadas. Se eu tivesse três linhas duplicadas, teria definido o número de linhas como 2, para excluir as duas primeiras que vê e deixar apenas uma na tabela t1.
Espero que ajude alguém
fonte
Tente usar:
fonte
Depois de tentar a solução sugerida acima, isso funciona para pequenas tabelas médias. Eu posso sugerir essa solução para tabelas muito grandes. uma vez que é executado em iterações.
LargeSourceTable
sp_rename 'LargeSourceTable', 'LargeSourceTable_Temp'; GO
LargeSourceTable
novamente, mas agora, adicione uma chave primária com todas as colunas que definem as duplicaçõesWITH (IGNORE_DUP_KEY = ON)
Por exemplo:
CREATE TABLE [dbo].[LargeSourceTable] ( ID int IDENTITY(1,1), [CreateDate] DATETIME CONSTRAINT [DF_LargeSourceTable_CreateDate] DEFAULT (getdate()) NOT NULL, [Column1] CHAR (36) NOT NULL, [Column2] NVARCHAR (100) NOT NULL, [Column3] CHAR (36) NOT NULL, PRIMARY KEY (Column1, Column2) WITH (IGNORE_DUP_KEY = ON) ); GO
Crie novamente as visualizações que você soltou em primeiro lugar para a nova tabela criada
Agora, execute o seguinte script sql, você verá os resultados em 1.000.000 de linhas por página, poderá alterar o número da linha por página para ver os resultados com mais frequência.
Observe que eu ativei
IDENTITY_INSERT
e desativei porque uma das colunas contém um ID incremental automático, que também estou copiandoSET IDENTITY_INSERT LargeSourceTable ON DECLARE @PageNumber AS INT, @RowspPage AS INT DECLARE @TotalRows AS INT declare @dt varchar(19) SET @PageNumber = 0 SET @RowspPage = 1000000
select @TotalRows = count (*) from LargeSourceTable_TEMP
SET IDENTITY_INSERT LargeSourceTable OFF
fonte
Existem duas soluções em
mysql
:A) Excluir linhas duplicadas usando a
DELETE JOIN
instruçãoEsta consulta faz referência à tabela de contatos duas vezes; portanto, ela usa o alias da tabela
t1
et2
.A saída é:
Caso deseje excluir linhas duplicadas e manter o
lowest id
, você pode usar a seguinte instrução:B) Excluir linhas duplicadas usando uma tabela intermediária
A seguir, são mostradas as etapas para remover linhas duplicadas usando uma tabela intermediária:
1. Crie uma nova tabela com a estrutura igual à tabela original que você deseja excluir linhas duplicadas.
2. Insira linhas distintas da tabela original na tabela imediata.
3. Insira linhas distintas da tabela original na tabela imediata.
Etapa 1. Crie uma nova tabela cuja estrutura seja igual à tabela original:
Etapa 2. Insira linhas distintas da tabela original na nova tabela:
Etapa 3. Solte a tabela original e renomeie a tabela imediata para a original
Fonte: http://www.mysqltutorial.org/mysql-delete-duplicate-rows/
fonte
fonte
Você precisa agrupar os registros duplicados de acordo com o (s) campo (s), depois manter um dos registros e excluir o restante. Por exemplo:
fonte
A exclusão de duplicatas de uma tabela enorme (vários milhões de registros) pode levar muito tempo. Sugiro que você faça uma inserção em massa em uma tabela temporária das linhas selecionadas, em vez de excluir.
fonte
Isso pode ser feito de várias maneiras no servidor sql. A maneira mais simples de fazer isso é: Insira as linhas distintas da tabela de linhas duplicadas na nova tabela temporária. Em seguida, exclua todos os dados da tabela de linhas duplicadas e insira todos os dados da tabela temporária que não possui duplicatas, como mostrado abaixo.
Excluir linhas duplicadas usando o Common Table Expression (CTE)
fonte
fonte
Com referência a https://support.microsoft.com/en-us/help/139444/how-to-remove-duplicate-rows-from-a-table-in-sql-server
A idéia de remover duplicados envolve
Passo a passo
fonte
Se você tiver a capacidade de adicionar uma coluna à tabela temporariamente, esta foi uma solução que funcionou para mim:
Em seguida, execute um DELETE usando uma combinação de MIN e GROUP BY
Verifique se o DELETE foi executado corretamente:
O resultado não deve ter linhas com uma contagem maior que 1. Por fim, remova a coluna rowid:
fonte
Outra maneira de remover linhas publicadas, sem perder informações em uma etapa, é como a seguir:
fonte
Oh uau, eu me sinto tão estúpido por preparar todas essas respostas, elas são como a resposta de especialistas com todas as tabelas CTE e temporárias e etc.
E tudo o que fiz para fazê-lo funcionar foi simplesmente agregar a coluna ID usando o MAX.
NOTA: pode ser necessário executá-lo várias vezes para remover duplicados, pois isso excluirá apenas um conjunto de linhas duplicadas por vez.
fonte
fonte
fonte