Usuário com melhor resposta
Dados duplicados - Duvida cruel !!!

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
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
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 FernandesMCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba -
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'
-
-
-
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.
-
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) > 1Select 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) > 1Se 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!
-
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