none
Dados duplicados - Duvida cruel !!! RRS feed

  • Pergunta

  • Boa tarde.

    Pessoal estou com uma grande duvida, já pesquisei , queimei uns neuronios e estou apelando aos Gurus do SQL ...Rsrsrsrsrs .

    Bom a duvida e o seguinte.

    Executo uma query e vejo no resultado alguns registros duplicados/triplicados e não sei o pq que esta saindo mais de 1vez, pois uma vez que todos os registros são submetidos a mesma query ??

    segue a query

     

    select

    ti.codposatd as [posto],

    ti.inscricao_trab as [Inscricao]

    from trab_inscr ti with(nolock)

    inner join historico_emprego he with(nolock) on

    (  ti.inscricao_trab   =   he.inscricao_trab  )

    where ti.codposatd not in ( '8888999' ,'99998888' )

    and he.tipo_hist_encaminha = '2'

    and he.data_hist between '10-01-2010'  and  '10-31-2010'

     

    Segue o resultado ...  vejam que alguns registros retornam somente uma vez mas outros mais de uma vez, sendo que o correto seria retornarem somente uma vez.

     

    Segue o resultado da query.

     

    posto   Inscricao  
    3550010   19235232  
    3550010   19236736  
    3550010   19236736  
    3550010   17472277  
    3550010   17474233  
    3550010   17474397  
    3550010   17474397  
    3550010   17475469  
    3550010   17478366  
    3550010   17479706  
    3550010   17479706  
    3550010   17479888 Triplicado ??
    3550010   17479888
    3550010   17479888
    3550010   17485486  
    3550010   17486883  
    3550010   17486883  
    3550010   17488882 Duplicado ??
    3550010   17488882
    3550010   17490050  
    3550010   17490050  
    3550010   20142736  
    3550010   20142736  
    3550010   20143949  
    3550010   19241159  
    3550010   19241159  
    3550010   19243888  
    3550010   19243888  
    3550010   17749117  
    3550010   17749117  
    3550010   20252679  
    3550010   20255335  
    3550010   17520607 5 xs
    3550010   17520607
    3550010   17520607
    3550010   17520607
    3550010   17520607
    3550010   17524887  
    3550010   17525321  
    3550010   17525321  
    3550010   17525321  
    3550010   20296272  
    3550010   20296272  
    3550010   20296272  
    3550010   20297228  
    3550010   20297333  
    3550010   20297419  
    3550010   20298346  
    3550010   20299725  
    3550010   20299775 6 xs
    3550010   20299775
    3550010   20299775
    3550010   20299775
    3550010   20299775
    3550010   20299775
    3550010   20299891  
    3550010   20299891  
    3550010   20299891  
    3550010   20300000  

     

    Gostaria de saber onde esta sendo o erro ....?

    Desde já obrigado .

    Lacerda

     

     

     

    quinta-feira, 3 de março de 2011 18:59

Respostas

  • Distinct ou group by vai resolver seu problema mas não é o correto.

    Se você quer retornar os dados de apenas uma tabela,  e usar a outra para fazer os filtros use a clausula EXISTS:

    Por ex:

    SELECT ti.codposatd as [posto],
        ti.inscricao_trab as [Inscricao]
     FROM trab_inscr ti with(nolock)
     WHERE EXISTS(SELECT *
            FROM historico_emprego he
           WHERE ti.inscricao_trab = he.inscricao_trab
            AND he.tipo_hist_encaminha = '2'
            AND he.data_hist between '10-01-2010' and '10-31-2010')
      AND ti.codposatd not in ( '8888999' ,'99998888' )
    

    Abraços

    []s

    Fabiano

     


    Fabiano Neves Amorim - MCTS / MCP - SQLServer - http://blogs.solidq.com/fabianosqlserver/
    • Sugerido como Resposta Eder Costa segunda-feira, 7 de março de 2011 16:11
    • Marcado como Resposta Eder Costa quarta-feira, 9 de março de 2011 18:23
    sexta-feira, 4 de março de 2011 15:22

Todas as Respostas

  • Lacerda,

    teste o script abaixo...

    select
    ti.codposatd as [posto],
    ti.inscricao_trab as [Inscricao] 
    from trab_inscr ti with(nolock) 
    inner join historico_emprego he with(nolock) on
    ( ti.inscricao_trab  =  he.inscricao_trab )
    where ti.codposatd not in ( '8888999' ,'99998888' )
    and he.tipo_hist_encaminha = '2'
    and he.data_hist between '10-01-2010' and '10-31-2010'
    GROUP by ti.codposatd, ti.inscricao_trab
    

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quinta-feira, 3 de março de 2011 19:14
    Moderador
  • Claro que não seria o mais correto, mas em casos de urgência o distinct sempre resolve:

     

    select distinct
    
    ti.codposatd as [posto],
    
    ti.inscricao_trab as [Inscricao]
    
    from trab_inscr ti with(nolock)
    
    inner join historico_emprego he with(nolock) on
    
    ( ti.inscricao_trab  =  he.inscricao_trab )
    
    where ti.codposatd not in ( '8888999' ,'99998888' )
    
    and he.tipo_hist_encaminha = '2'
    
    and he.data_hist between '10-01-2010' and '10-31-2010'
    

    quinta-feira, 3 de março de 2011 19:33
  • O DISTINCT acho que resolverá o seu problema....assim como o Daniel citou.
    quinta-feira, 3 de março de 2011 19:53
  • Distinct pra apagar o incêndio, depois se der tempo volta e arruma a query direito.

     

    quinta-feira, 3 de março de 2011 21:54
  • Usando como exemplo a inscrição 17479888 (triplicado), esse valor só ocorre uma vez em trab_isncr? Provavelmente ocorre três vezes, no posto 3550010, certo? Essa seria a causa da repetição no resultado da query, o que não é exatamente um erro.
    sexta-feira, 4 de março de 2011 00:20
  • Antonio,

    a coluna deve possuir valores repetidos em pelo menos uma das tabelas que você utiliza nessa query.

    Segue script para verificar a quantidade de ocorrência das colunas que estão sendo usadas no Join em cada tabela

    Select inscricao_trab,
            COUNT(1)
    From trab_inscr
    Where codposatd not in ( '8888999' ,'99998888' )
    Group by inscricao_trab
    Having COUNT(1) > 1

    Select inscricao_trab,
            COUNT(1)
    From historico_emprego
    Where   tipo_hist_encaminha = '2'
      And   data_hist between '10-01-2010'  and  '10-31-2010'
    Group by inscricao_trab
    Having COUNT(1) > 1

    Se você quiser trazer apenas uma linha, mesmo que hajam registros repetidos, ai o distinct ou o group seriam a solução para o seu problema, conforme o pessoal já comentou.

    Espero que ajude!

     

    sexta-feira, 4 de março de 2011 00:45
  • Distinct ou group by vai resolver seu problema mas não é o correto.

    Se você quer retornar os dados de apenas uma tabela,  e usar a outra para fazer os filtros use a clausula EXISTS:

    Por ex:

    SELECT ti.codposatd as [posto],
        ti.inscricao_trab as [Inscricao]
     FROM trab_inscr ti with(nolock)
     WHERE EXISTS(SELECT *
            FROM historico_emprego he
           WHERE ti.inscricao_trab = he.inscricao_trab
            AND he.tipo_hist_encaminha = '2'
            AND he.data_hist between '10-01-2010' and '10-31-2010')
      AND ti.codposatd not in ( '8888999' ,'99998888' )
    

    Abraços

    []s

    Fabiano

     


    Fabiano Neves Amorim - MCTS / MCP - SQLServer - http://blogs.solidq.com/fabianosqlserver/
    • Sugerido como Resposta Eder Costa segunda-feira, 7 de março de 2011 16:11
    • Marcado como Resposta Eder Costa quarta-feira, 9 de março de 2011 18:23
    sexta-feira, 4 de março de 2011 15:22