Jump to content

POWERED BY:

Archived

This topic is now archived and is closed to further replies.

Carlos Antoliv

Consulta INNER JOIN vindo duplicada. Como Resolver?

Recommended Posts

OBS:Antes de tudo, já existem tópico com mesmo teor, poréns uns respondidos especificamente e outros mal explicados.

 

Senhores, tenho duas tabelas, com campos que possuem os mesmos dados:

 

- tb_xml;

- numeroGuiaPrestador

- tb_far;

-numeroFicha

 

Esses campos funcionam como um tipo de ID.

 

Ao tentar realizar o INNER JOIN entre essas duas tabelas, o resultado é triplicado.

 

Pra eu obter o resultado aproximado do normal, utilizo o DISTINCT:

 

SELECT DISTINCT x.numeroGuiaPrestador, x.codigoProcedimento, x.descricaoProcedimento FROM tb_xml x
INNER JOIN tb_far f ON x.numeroGuiaPrestador = f.numeroFicha_far WHERE x.numeroGuiaPrestador='5000000008'

 

Nessa consulta, o resultado aparece normal. Mas quando acrescento o campo valor_far da tabela tb_far, os dados ficam triplicados.

Ex:

 

SELECT x.numeroGuiaPrestador, x.codigoProcedimento, x.descricaoProcedimento, f.valor_far FROM tb_xml x
INNER JOIN tb_far f ON x.numeroGuiaPrestador = f.numeroFicha_far WHERE x.numeroGuiaPrestador='5000000008'

Já tentei utilizar o DISTINCT e o GROUP BY, mas não obtive muito sucesso. Será que tenho que utilizar um tipo de função?

 

Porque veja bem, no código supracitado, busco todos os registros que contenham o numero dessa ficha "5000000008", que me retornar 8 registros. Nas duas tabelas existem 8 registros dessa mesma ficha, ou seja tb_xml tem 8 registros e tb_far tem 8 registros.

E quando realizo a consulta, é me retornado 64 registros.

 

É como se realizasse uma operação matemática da multiplicação: 8 x 8 = 64.

 

O que pode estar acontecendo?

Share this post


Link to post
Share on other sites

O que ocorre de fato é uma multiplicação , pesquise por PRODUTO CARTESIANO.

 

Mas vamos lá , qual o realcionamento entre as tabelas pks e fks !?

Share this post


Link to post
Share on other sites

Oi, Motta, vou pesquisar sim. Sinceramente, eu gostaria de entender porque a consulta exibiu aquele resultado.

 

Mas....

 

Será que podemos chamar de PKs?

 

Prq a estrutura é assim:

 

- tb_xml;

- numeroGuiaPrestador

- tb_far;

-numeroFicha

faço o INNER para buscar 3 campos que existem dentro da tb_far

Share this post


Link to post
Share on other sites

Um xml pode ter mais de um far, nao ?

 

 

Liste um exemplo de como estão e de como quer exibir os dados.

Share this post


Link to post
Share on other sites

tenho as

 

- tb_xml;

- numeroGuiaPrestador

- tb_far;

-numeroFicha

 

esses campos são número de fichas. Existe uma em cada tabela. E são completamente iguais.

 

dentro da tb_far existem 3 campos que não existem na tb_xml

 

Então para resgatá-los, faço assim:

 

SELECT x.numeroGuiaPrestador, x.codigoProcedimento, x.descricaoProcedimento, f.valor_far FROM tb_xml x
INNER JOIN tb_far f ON x.numeroGuiaPrestador = f.numeroFicha_far WHERE x.numeroGuiaPrestador='5000000008'

 

o problema está quando coloco aquele campo que está em negrito "f.valor_far". Nesse momentos os dados dupllicam.

 

conseguiu compreender? Se não, explico novamente, não tem problema. O negócio é entendermos.

Share this post


Link to post
Share on other sites

Tem certeza que a relação é 1:1 !?

 

Faça selects separados para cada umacdasctabelas sem join para ter certeza.

Share this post


Link to post
Share on other sites

Motta, na minha ideia sim. Mas vou te explicar e me corrija se eu estiver errado.

 

Tenho duas tabelas que são alimentadas de forma independentes.

A tb_far alimento uma vez ao dia.

A tb_xml alimento quase toda hora.

 

Aí, existe uma outra tabela que rebece o INSERT do resultado dessas duas tabelas.

Por exemplo, naquele SELECT que te mostrei, faço a consulta, os dados são exibidos na tela, e tem um checkbox para marcar caso sejam esses os dados. Então é enviado para uma terceira tabela.

 

nas duas tabelas existe o número da ficha da pessoa, mas na tb_far existe os exames que a pessoa realizou.

Entao minha ideia foi realizar um JOIN?

 

Seu eu não fui claro (rsrs) pode falar...

abç

Share this post


Link to post
Share on other sites

nas duas tabelas existe o número da ficha da pessoa, mas na tb_far existe os exames que a pessoa realizou.

Entao minha ideia foi realizar um JOIN?

 

 

Então deve retornar mas de uma linha , normal então.

 

faça

SELECT  x.numeroGuiaPrestador, x.codigoProcedimento, x.descricaoProcedimento
FROM tb_xml x
WHERE x.numeroGuiaPrestador='5000000008'
SELECT  f.*
FROM tb_far f 
WHERE f.numeroFicha_far ='5000000008'

Share this post


Link to post
Share on other sites

Motta, anteriormente, eu tinha tentado isso:

 

SELECT x.numeroGuiaPrestador.*, x.codigoProcedimento.*, x.descricaoProcedimento.*, f.valor_exame_far.* FROM tb_xml x
INNER JOIN tb_far f ON x.numeroGuiaPrestador = f.numeroFicha_far WHERE x.numeroGuiaPrestador='5340149248'



Esses que vc disponibilizou são dois selects. Não consegui rodar não.

 

coloquei assim:

 

SELECT x.numeroGuiaPrestador, x.codigoProcedimento, x.descricaoProcedimento
FROM tb_xml x
WHERE x.numeroGuiaPrestador='50000000003'

SELECT f.*
FROM tb_far f
WHERE f.numeroFicha_far ='50000000003'

 

 

os erros:

 

 SELECT  x.numeroGuiaPrestador, x.codigoProcedimento, x.descricaoProcedimento
FROM tb_xml x
WHERE x.numeroGuiaPrestador='50000000003'

SELECT f.*
FROM tb_far f
WHERE f.numeroFicha_far ='50000000003'

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT f.*
FROM tb_far f
WHERE f.numeroFicha_far ='50000000003'' at line 5

Share this post


Link to post
Share on other sites

A ideia de rodar os selects separados era ver o resultado , quantas linhas cada um retorna.

Share this post


Link to post
Share on other sites

Se ambos retornam 8 linhas, então o resultado está correto. Isso quer dizer que mesmo número de exames que exist eem um existe em outro, com seus respectivos valores.

 

Agora seria só exibir esses registros .

Share this post


Link to post
Share on other sites

Motta,

dessa maneira, o campo valor_far repete:

 

SELECT DISTINCT x.numeroGuiaPrestador, x.codigoProcedimento, x.descricaoProcedimento, f.valor_exame_far FROM tb_xml x
INNER JOIN tb_far f ON x.numeroGuiaPrestador = f.numeroFicha_far WHERE x.numeroGuiaPrestador='5000000008'
GROUP BY descricaoProcedimento

 

 

 

Aparecem os 8 registros, contudo valor_exame_far se repete.

Share this post


Link to post
Share on other sites

Verificou se não e iste outro campo chave , sequencial etc ?!

Share this post


Link to post
Share on other sites

Seu modelo não liga corretamente as duas tabelas , pela imagem que me enviou falta um link entre as duas tabelas , a tabela tb_fanf deveria ter algum código que identificasse a linha correspondente do xml.

 

Ou a idxml ou o codigoprocedimento , como está não tem como linkar o hemograma com o hemograma.

 

O mais próximo que se tem (eu vejo) é o codigoprocedimento contra a siglaexame_fanf mas mesmo assim ruim de fazer join

 

Não me parece questão de sql e sim de modelo , não o que linkar.

 

Não sei como recebeu esta tarefa mas terá de rever estes modelo, sua tarefa me parece ligar

 

a "glicose soro" da 1ª tabela ao "GLICS" da segunda.

 

veja se existe uma tabela do tipo de-para, mas pesquise com quem te passou esta "bagaça" , faltam dados do modelo.

Share this post


Link to post
Share on other sites

Compreendi.

 

mas ajude-me a entender..assim...vou explicar..

 

a tb_fanf é alimentada a partir de uma planilha, ou seja, importa-se uma planilha diariamente.

 

agora, outra pessoa vai cadastrar arquivos xml na tb_xml.

 

Podemos percebermos que são independentes, sem ligação, mas que possuem o mesmo campo: guia/ficha.

 

Agora, fiz um select que vai mostrar se o campo da tb_xml é igual ao da tb_fanf,

se for,

mostra na tela...

a ideia é mostrar na tela os arquivos XML que existem na tb_fanf.

 

 

Entendeu?

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.