none
Verificacao de duplicidade RRS feed

  • Pergunta

  • Boa tarde,

    Estou com o seguinte caso:

    Eu tenho em uma unica tabela cerca de 350.000 nomes (dados de PF), que eu juntei entre duas tabelas. Com isso eu quero saber quais os nomes que são iguais para junta-los em uma unica base consolidada SEM DUPLICADAS, porem tem casos que esta assim:

    Linha 1: Victor Hugo G. da Silva

    Linha 2: Victor Silva

    No caso, essas duas linhas se referenciam ao MESMO cliente, então gostaria de saber como deve ser feito o select para que eu consiga verificar se o nome do cliente na COLUNA 1 possui NO MINIMO 1 nome igual a COLUNA 2. 

    EXEMPLO REAL:

    Nesse caso é a MESMA pessoa porem cadastrados com o nome diferente, dendo assim queria um SELECT para verificar se possui AO MENOS 1 nome igual (ex: ABEL -> que aparece em ambas as colunas)

    NOME_ENR ÚltimoDeNM_PESSOA


    ABEL PORTILHO MAGALHAES JUNIOR ABEL MAGALHAES JR

    Espero que tenham entendido e que possam me ajudar, desde já agradeço a atenção!


    sexta-feira, 2 de outubro de 2015 17:43

Respostas

  • Problema de copy & Paste... Foi mal.

    SELECT  ca.NU_CPF, ca.ÚltimoDeNM_PESSOA, JB.NOME_ENR
    FROM cpf_agrupado as CA   
    INNER JOIN Job51429_Serasa_PF as JB 
    ON 
    jb.CPF_PADR = ca.NU_CPF 
    AND
    Substring(ca.ÚltimoDeNM_PESSOA,1,charindex(' ',ca.ÚltimoDeNM_PESSOA,1)) = Substring(JB.NOME_ENR,1,charindex(' ',JB.NOME_ENR,1))
    []'s!


    /* Logan Destefani Merazzi - http://www.merazzi.eti.br Se a resposta for útil, por favor, não esqueça de marcá-la como resposta. */


    segunda-feira, 5 de outubro de 2015 14:39

Todas as Respostas

  • Colega,

    Por acaso existe algum campo chamado: ID, Código, ou algo similar que faça o controle do registro de cada usuário?

    Acredito que a melhor forma é tentar analisar a duplicidade de dados através de um campo numérico, pois se você for realizar isso através de um campo texto, terá enormes dificuldades.

    Estas duas tabelas possuem a mesma estrutura?


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 2 de outubro de 2015 17:48
  • Possui sim o CPF porem com o mesmo CPF como se trata de duas bases diferentes o nome pode estar diferente, ex:

    CPF Nome

    111.111.111-01 Victor Hugo Garcia da Silva

    111.111.111-01 Victor Silva

    No caso eu teria que fazer a verificação não com o nome sendo EXATAMENTE igual e sim contendo PELO MENOS 1 parte do nome igual, que no exemplo acima poderia ser o primeiro nome (Victor).

    A verificação pelo ID (que seria o CPF) eu já fiz, me voltou cerca de 200.000 nomes IDÊNTICOS, falta eu analisar os +/- 150.000 nomes que PODEM conter no minimo o Primeiro nome igual.
    sexta-feira, 2 de outubro de 2015 17:51
  • Colega,

    Isso mesmo, você poderia analisar se o primeiro nome, cpf e até mesmo sexo em ambas as tabelas são iguais.

    Para você obter o primeiro nome poderia utilizar as funções String e CharIndex, veja o exemplo abaixo:

    Declare @var varchar(100)
    set @var = 'Microsoft Brasil LTDA.'
    
    Select Substring(@var,1,charindex(' ',@var,1))


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 2 de outubro de 2015 18:27
  • Colega,

    Ok, entendi mas como minha base tem mais de 300 mil dados, queria saber se em vez de eu colocar o nome:

    set @var = 'Microsoft Brasil LTDA.'

    eu colocar o nome da coluna, para que eu possa executar de uma maneira a pegar todos os dados e não uns específicos.

    segunda-feira, 5 de outubro de 2015 12:58
  • Bom dia,

    Eu bolei uma consulta que pode te ajudar...

    Primeiramente, eu criei um dicionário, com todas as palavras da tabela e, com base nesse dicionário, você pode fazer uma comparação entre eles... acho melhor do que comparar apenas a primeira palavra do nome, mas isso pode gerar alguns outros falso positivos que devem ser analisados.

    Segue a consulta:

    create table #tstLogan2 (nome varchar(50)) go insert into #tstLogan2 Values ('Logan Destefani Merazzi'), ('Juca Merazzi'), ('Joao da Silva'), ('Logan Sauro') GO -- Criação do dicionário de palavras da tabela, selecione a partir daqui Declare @x xml ;with cte_1 (xml1) as ( select ',' + nome from #tstLogan2 for xml path('') ) select @x = cast(replace('<A>'+ replace(xml1,' ','</A><A>')+ '</A>',',','</A><A>') as xml) from cte_1 select distinct t.value('.', 'varchar(50)') as inVal into #dicionario from @x.nodes('/A') as cte_xml(t)

    -- selecionar até aqui

    delete from #dicionario where inVal in ('','da','do','das','dos')

    ;with cte_2 as( select * from #tstLogan2 t join #dicionario d on patindex('%' + d.inval +'%',t.nome) > 0 ) select * from cte_2 c1 join cte_2 c2 on c1.inval = c2.inval where c1.nome <> c2.nome

    note que a tabela #dicionário terá algumas palavras "erradas" e que devem ser removidas: 'da', 'do', 'das' e um registro vazio, que deve ser deletado também.

    Caso tenha alguma dúvida, só falar.

    []'s!


    /* Logan Destefani Merazzi - http://www.merazzi.eti.br Se a resposta for útil, por favor, não esqueça de marcá-la como resposta. */


    segunda-feira, 5 de outubro de 2015 13:09
  • Caro, bom dia!

    Desculpe o trabalho mas creio que não me ajudou muito não, creio q o select seja mais simples do que estamos fazendo. Dos 350 mil dados APENAS 39 mil estão com o mesmo CPF porem com os nomes diferentes (consegui fazer isso no excel mas quero fazer através de comando SQL), eu teria que realmente selecionar os clientes filtrando se o CPF é igual e se o primeiro nome também seja igual.

    As tabelas eu importei as duas para o mesmo banco de dados, ou seja, consigo fazer um Inner Join sem problemas mas o que eu não sei fazer é o select buscando a primeira palavra da coluna NOME de uma tabela e da outra. Tem como fazer isso através do SQL?

    Abraços! 


    segunda-feira, 5 de outubro de 2015 13:53
  • Opa,

    Se o que você quer fazer é realmente comparar apenas o primeiro nome, a solução do Junior Galvão é a que você precisa... :-)

    select t1.CPF, t1.nome1, t2.nome2
    from tabela1 t1
    join tabela2 t2
    where t1.cpf = t2.cpf
    and Substring(t1.nome,1,charindex(' ',t1.nome,1) = Substring(t2.nome,1,charindex(' ',t2.nome,1)

    Isso vai comprar o primeiro nome de cada registro com o cpf...

    Por favor, desmarque a resposta que foi marcada como correta acima... Foi marcada indevidamente.

    Se esta te ajudar, marque esta. :-)

    []'s!


    /* Logan Destefani Merazzi - http://www.merazzi.eti.br Se a resposta for útil, por favor, não esqueça de marcá-la como resposta. */

    segunda-feira, 5 de outubro de 2015 14:08
  • Bom, é isso mesmo que eu estou precisando porem esta dando erro de sintaxe:

    SELECT  ca.NU_CPF, ca.ÚltimoDeNM_PESSOA, JB.NOME_ENR

    FROM cpf_agrupado as CA   

    INNER JOIN Job51429_Serasa_PF as JB 

    ON 

    jb.CPF_PADR = ca.NU_CPF 

    AND

    Substring(ca.ÚltimoDeNM_PESSOA,1,charindex(' ',ca.ÚltimoDeNM_PESSOA,1) = Substring(JB.NOME_ENR,1,charindex(' ',JB.NOME_ENR,1)

    Msg 102, Level 15, State 1, Line 13
    Incorrect syntax near '='.

    segunda-feira, 5 de outubro de 2015 14:34
  • Problema de copy & Paste... Foi mal.

    SELECT  ca.NU_CPF, ca.ÚltimoDeNM_PESSOA, JB.NOME_ENR
    FROM cpf_agrupado as CA   
    INNER JOIN Job51429_Serasa_PF as JB 
    ON 
    jb.CPF_PADR = ca.NU_CPF 
    AND
    Substring(ca.ÚltimoDeNM_PESSOA,1,charindex(' ',ca.ÚltimoDeNM_PESSOA,1)) = Substring(JB.NOME_ENR,1,charindex(' ',JB.NOME_ENR,1))
    []'s!


    /* Logan Destefani Merazzi - http://www.merazzi.eti.br Se a resposta for útil, por favor, não esqueça de marcá-la como resposta. */


    segunda-feira, 5 de outubro de 2015 14:39
  • Caro,

    Perfeito! Conseguiu me ajudar em tudo. Muitíssimo obrigado por sua atenção e ajuda.

    Abraços. 

    segunda-feira, 5 de outubro de 2015 15:05