none
Registros Repetidos RRS feed

  • Pergunta

  • Olá pessoal,

     

    Tenho uma tabela já preenchida com mais de 100 milhões de registros, porém existem uma série deles repetidos. Gostaria de saber como poderei apenas deletar esses registros repetidos.

     

     

    obrigado

    terça-feira, 26 de junho de 2007 14:33

Respostas

  •  

    Danilo,

     

    Se esse seu campo ID for um campo CHAVE, você pode usar desta forma:

    Code Snippet

     

    ALTER TABLE Tabela

    ADD NovoCampo BIT

     

    UPDATE T

    SET NovoCampo = 1

    FROM Tabela T

    INNER JOIN

    (SELECT max (ID), Nome, Email, Apelido, UF

    FROM Tabela

    GROUP BY Nome, Email, Apelido, UF) TBL ON T.ID = TBL.ID

     

    -- CUIDADO: Faça BACKUP antes!!!

    DELETE FROM Tabela

    WHERE NovoCampo IS NULL

     

    ALTER TABLE Tabela

    DROP COLUMN NovoCampo

     

    Desta forma, você estará primeiro, adicionando um campo de controle para depois deletar.

     

    Agora, se aquele campo ID não for chave, aí você terá que usar a solução do DISTINCT jogando os dados únicos para uma tabela temporária.

     

     

    Qualquer coisa, retorne.

     

     

    Abraço

     

     

     

     

    terça-feira, 26 de junho de 2007 18:15
  • Danilo,

    vc tb pode fazer num único comando SQL, como abaixo:

    imagino que sua tabela seria assim:

    Code Snippet

    create table teste_tb(id int not null identity,Nome varchar(150),Email varchar(130),Apelido varchar(30),UF char(2))


    então são inseridos registros duplicados:

    Code Snippet

    insert into teste_tb(Nome,Email,Apelido,UF)values('Gesiel','algo@provedor.com','nick name','RJ')
    insert into teste_tb(Nome,Email,Apelido,UF)values('Gesiel','algo@provedor.com','nick name','RJ')
    insert into teste_tb(Nome,Email,Apelido,UF)values('Gesiel','algo@provedor.com','nick name','RJ')
    insert into teste_tb(Nome,Email,Apelido,UF)values('Maria','maria@provedor.com','nick Maria','RJ')
    insert into teste_tb(Nome,Email,Apelido,UF)values('Maria','maria@provedor.com','nick Maria','RJ')
    insert into teste_tb(Nome,Email,Apelido,UF)values('Maria','maria@provedor.com','nick Maria','RJ')
    insert into teste_tb(Nome,Email,Apelido,UF)values('Arthur','arthur@provedor.com','nick Arthur','SP')


    ao fazer um select, o resultado é o que aparece:

    Code Snippet

    select id, Nome,Email,Apelido,UF from teste_tb

    id    Nome    Email    Apelido    UF
    1    Gesiel    algo@provedor.com    nick name    RJ
    2    Gesiel    algo@provedor.com    nick name    RJ
    3    Gesiel    algo@provedor.com    nick name    RJ
    4    Maria    maria@provedor.com    nick Maria    RJ
    5    Maria    maria@provedor.com    nick Maria    RJ
    6    Maria    maria@provedor.com    nick Maria    RJ
    7    Arthur    arthur@provedor.com    nick Arthur    SP


    Ai aplicamos um delete na tabela conforme o modelo abaixo:

    Code Snippet

    delete from teste_tb
    where id <> (select min(a.id)
            from teste_tb a
            where teste_tb.Nome = a.Nome and
                    teste_tb.Email = a.Email and
                    teste_tb.Apelido = a.Apelido and
                    teste_tb.UF = a.UF)


    Ao fazer novo select, só existem registros únicos na tabela, como abaixo:

    Code Snippet

    select id, Nome,Email,Apelido,UF from teste_tb

    id    Nome    Email    Apelido    UF
    1    Gesiel    algo@provedor.com    nick name    RJ
    4    Maria    maria@provedor.com    nick Maria    RJ
    7    Arthur    arthur@provedor.com    nick Arthur    SP


    Espero que te ajude.
    terça-feira, 26 de junho de 2007 23:08

Todas as Respostas

  •  

    Olá Danilo,

     

    Se o registro inteiro estiver duplicado, você poderia jogar um SELECT DISTINCT dessa sua tabela numa tabela temporária, em seguinda truncar sua tabela original e então jogar os dados corretos de volta.

     

    Essa com certeza será uma tarefa bem demorada, mas resolve.

     

     

    Abraço

    terça-feira, 26 de junho de 2007 16:10
  • com essa quantidade tambem acho melhor fazer isso criar uma tabela com todos os dados nao duplicados usando o ou distinct ou group by em todas as colunas truncar a tabela original e depois fazer o insert, so preste atencao se vc. tem campos identity vc. deve usar o set identity_insert on para poder aproveitar a sequencia que ja existia.

     

    Abs;

    terça-feira, 26 de junho de 2007 16:12
  • Danilo,

    A solução depende da estrutura da tabela.
    vc poderia postar a estrutura da tabela?
    terça-feira, 26 de junho de 2007 16:13
  • Danilo,

     

    Concordo com o Alexandre e com o Marcelo, em relação a utilização do Distinct e também da criação de tables temporárias.

    terça-feira, 26 de junho de 2007 16:39
  • Olá pessoal,

     

    Muito obrigado pelas soluções que vocês deram. Tinha pensado nisso de usar o distinct com uma tabela temporária, porém não sei se isso poderia ser inviável, pois meu limite de espaço que tenho é de 10Gb e o banco de dados só com essa tabela já chegou nos 5.5Gb. Será que não existe uma outra solução?

     

    Gesiel, a estrutura da minha tabela é simples:

    ID int

    Nome varchar(150)

    Email varchar(130)

    Apelido varchar(30)

    UF char(2)

     

     

    Abraços!

    terça-feira, 26 de junho de 2007 17:35
  •  

    Danilo,

     

    Se esse seu campo ID for um campo CHAVE, você pode usar desta forma:

    Code Snippet

     

    ALTER TABLE Tabela

    ADD NovoCampo BIT

     

    UPDATE T

    SET NovoCampo = 1

    FROM Tabela T

    INNER JOIN

    (SELECT max (ID), Nome, Email, Apelido, UF

    FROM Tabela

    GROUP BY Nome, Email, Apelido, UF) TBL ON T.ID = TBL.ID

     

    -- CUIDADO: Faça BACKUP antes!!!

    DELETE FROM Tabela

    WHERE NovoCampo IS NULL

     

    ALTER TABLE Tabela

    DROP COLUMN NovoCampo

     

    Desta forma, você estará primeiro, adicionando um campo de controle para depois deletar.

     

    Agora, se aquele campo ID não for chave, aí você terá que usar a solução do DISTINCT jogando os dados únicos para uma tabela temporária.

     

     

    Qualquer coisa, retorne.

     

     

    Abraço

     

     

     

     

    terça-feira, 26 de junho de 2007 18:15
  • Danilo,

    vc tb pode fazer num único comando SQL, como abaixo:

    imagino que sua tabela seria assim:

    Code Snippet

    create table teste_tb(id int not null identity,Nome varchar(150),Email varchar(130),Apelido varchar(30),UF char(2))


    então são inseridos registros duplicados:

    Code Snippet

    insert into teste_tb(Nome,Email,Apelido,UF)values('Gesiel','algo@provedor.com','nick name','RJ')
    insert into teste_tb(Nome,Email,Apelido,UF)values('Gesiel','algo@provedor.com','nick name','RJ')
    insert into teste_tb(Nome,Email,Apelido,UF)values('Gesiel','algo@provedor.com','nick name','RJ')
    insert into teste_tb(Nome,Email,Apelido,UF)values('Maria','maria@provedor.com','nick Maria','RJ')
    insert into teste_tb(Nome,Email,Apelido,UF)values('Maria','maria@provedor.com','nick Maria','RJ')
    insert into teste_tb(Nome,Email,Apelido,UF)values('Maria','maria@provedor.com','nick Maria','RJ')
    insert into teste_tb(Nome,Email,Apelido,UF)values('Arthur','arthur@provedor.com','nick Arthur','SP')


    ao fazer um select, o resultado é o que aparece:

    Code Snippet

    select id, Nome,Email,Apelido,UF from teste_tb

    id    Nome    Email    Apelido    UF
    1    Gesiel    algo@provedor.com    nick name    RJ
    2    Gesiel    algo@provedor.com    nick name    RJ
    3    Gesiel    algo@provedor.com    nick name    RJ
    4    Maria    maria@provedor.com    nick Maria    RJ
    5    Maria    maria@provedor.com    nick Maria    RJ
    6    Maria    maria@provedor.com    nick Maria    RJ
    7    Arthur    arthur@provedor.com    nick Arthur    SP


    Ai aplicamos um delete na tabela conforme o modelo abaixo:

    Code Snippet

    delete from teste_tb
    where id <> (select min(a.id)
            from teste_tb a
            where teste_tb.Nome = a.Nome and
                    teste_tb.Email = a.Email and
                    teste_tb.Apelido = a.Apelido and
                    teste_tb.UF = a.UF)


    Ao fazer novo select, só existem registros únicos na tabela, como abaixo:

    Code Snippet

    select id, Nome,Email,Apelido,UF from teste_tb

    id    Nome    Email    Apelido    UF
    1    Gesiel    algo@provedor.com    nick name    RJ
    4    Maria    maria@provedor.com    nick Maria    RJ
    7    Arthur    arthur@provedor.com    nick Arthur    SP


    Espero que te ajude.
    terça-feira, 26 de junho de 2007 23:08
  • Obrigado pessoal pelas diversas soluções apresentadas nessa Thread. Usei as soluções apresentadas tanto pelo Alexandre como pelo Gesiel que funcionaram perfeitamente. Muito obrigado!


    Um Grande Abraço a todos!

    quarta-feira, 27 de junho de 2007 19:10
  •  

    Legal Danilo,

     

    Qualquer coisa estamos por aqui.

     

     

    Abraço

    quarta-feira, 27 de junho de 2007 19:28