Ir para conteúdo

POWERED BY:

Arquivado

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

Lúcio Henrique de Oliveira

Inner Join não retorna o esperado.

Recommended Posts

Olá Amigos, estou com um probleminha.

 

Vejam a minha query abaixo:

SELECT
tb_prd_arquivos.id_prd_arquivo
FROM
tb_prd_arquivos
Inner Join tb_prd_arq_kit_book ON tb_prd_arq_kit_book.id_prd_arquivo <> tb_prd_arquivos.id_prd_arquivo
Inner Join tb_prd_arq_outros ON tb_prd_arq_outros.id_prd_arquivo <> tb_prd_arquivos.id_prd_arquivo
Inner Join tb_prd_arq_book ON tb_prd_arq_book.id_prd_arquivo <> tb_prd_arquivos.id_prd_arquivo
WHERE
tb_prd_arquivos.id_producao =  '14'

Isso é uma query que faz uma consulta em tres tabelas que possuem o campo id_prd_arquivo em comum.

O objetivo dela é retornar o seguinte: Deve retornar os IDS que não estão em nenhuma tabela, por isso o <>.

 

beleza, acontece que se uma tabela estiver vazia ele não retorna dado nenhum. Se eu retirar a tabela que está vazia funciona normalmente.

 

 

Acredito que possa ser qualquer coisa relacionada a INNER JOIN com várias tabelas (que possuem campos em comum).

Mas tentei de todas as formas e não tive sucesso.

 

Agradeço pela ajuda desde já

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, só atualizando aqui.

conforme o Paulo Caesar disse neste tópico aqui em tabelas vazias o inner join não funcionaria. Teria que utilizar o LEFT JOIN, fiz o teste mas acontece que ele mostra todos os resultados da tabela pai e não somente os que não estao selecionados.

 

O codigo ficaria assim:

SELECT
tb_prd_arquivos.id_prd_arquivo
FROM
tb_prd_arquivos
Left Join tb_prd_arq_kit_book ON tb_prd_arq_kit_book.id_prd_arquivo <> tb_prd_arquivos.id_prd_arquivo
Left Join tb_prd_arq_outros ON tb_prd_arq_outros.id_prd_arquivo <> tb_prd_arquivos.id_prd_arquivo
Left Join tb_prd_arq_book ON tb_prd_arq_book.id_prd_arquivo <> tb_prd_arquivos.id_prd_arquivo
WHERE
tb_prd_arquivos.id_producao =  '14'

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

É quase isso, você só precisa checar pelos retornos de cada tabela no seu WHERE:

SELECT
tb_prd_arquivos.id_prd_arquivo
FROM tb_prd_arquivos Left Join tb_prd_arq_kit_book ON tb_prd_arq_kit_book.id_prd_arquivo <> tb_prd_arquivos.id_prd_arquivo
Left Join tb_prd_arq_outros ON tb_prd_arq_outros.id_prd_arquivo <> tb_prd_arquivos.id_prd_arquivo
Left Join tb_prd_arq_book ON tb_prd_arq_book.id_prd_arquivo <> tb_prd_arquivos.id_prd_arquivo
WHERE tb_prd_arquivos.id_producao =  '14' AND tb_prd_arq_kit_book.id_prd_arquivo IS NOT NULL AND tb_prd_arq_outros.id_prd_arquivo IS NOT NULL AND tb_prd_arq_book.id_prd_arquivo IS NOT NULL

Veja se é isto. Ele irá voltar apenas valores que retornarem nas tabelas em que está fazendo left join.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado cara, isso que eu estava precisando.

Bom esse problema eu resolvi. Mas acontece que ao tentar fazer consultas utilizando essa artifício está dando pau.

Tenho aqui uma imagem que vai demonstrar o meu problema:

Imagem Postada

 

O que eu preciso é o seguinte:

tenho a tb_arquivos.

 

na minha query preciso informar o IDPROD (que na imagem é 1).

Ótimo, mas agora preciso retornar todos os outros que não tenham 1 em IDPROD (RESTANTE). Até ai sem problema.

O problema tá em retornar todos os outros que não tenham o IDPROD 1 E não sejam "em comum" com ele, ou seja nesse exemplo ai preciso retornar somente o 16,17 e 18.

 

Minha tabela fisica seria:

| IDPROD | ARQ |

| 1 | 10 |

| 1 | 11 |

| 1 | 12 |

| 1 | 13 |

| 1 | 14 |

| 1 | 15 |

| 2 | 14 |

| 3 | 15 |

| 2 | 16 |

| 3 | 17 |

| 3 | 18 |

 

 

Isso tá me tirando o sono. Agradeço qualquer ajuda sua e de qualquer outro membro.

 

Obrigado

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.