Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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?

Compartilhar este post


Link para o post
Compartilhar em outros 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 !?

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um xml pode ter mais de um far, nao ?

 

 

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

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

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

Compartilhar este post


Link para o post
Compartilhar em outros 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ç

Compartilhar este post


Link para o post
Compartilhar em outros 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'

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros 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 .

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.