Inner Join ao contrário... como fazer??

03/08/2006

0

Olá amigos!!

Tenho duas tabelas e preciso de fazer uma relação entre elas onde os códigos que estiverem em ambas não podem aparecer... somente os que estiverem em uma e não estiver em outra.

Qual a instrução em SQL para mysql 4.0 que eu tenho que fazer??
Desde já muito obrigado!!

Abraços a Todos

[color=green:32e1c496f3]Movido de Delphi para MySQL[/color:32e1c496f3]


Btovix

Btovix

Responder

Posts

03/08/2006

Dmalta

Faça um [b:c55ab39659]FULL JOIN[/b:c55ab39659] entre as duas tabelas, de forma que todos os registros da tabela do lado esquerdo e da tabela do lado direito sejam exibidos, mesmo que não exista um match entre as linhas. Depois [b:c55ab39659]filtre[/b:c55ab39659] pela condição em que os valores da tabela do lado esquerdo sejam nulos, ou seja, quando não existe match da primeira tabela, [b:c55ab39659]ou[/b:c55ab39659] que os valores da tabela do lado direito sejam nulos, ou seja, quando não encontre a chave na segunda tabela.

Usando a sintaxe ANSI SQL:

[b]SELECT[/b] A.*, B.*
[b]FROM[/b] A [b]FULL OUTER JOIN[/b] B [b]ON[/b]
   A.ID = B.ID
[b]WHERE[/b]
  A.ID IS NULL [b]OR[/b] B.ID IS NULL



Responder

03/08/2006

Dmalta

:!: Apenas retificando a formatação do código anterior:

SELECT A.*, B.* 
FROM A FULL OUTER JOIN B ON
   A.ID = B.ID 
WHERE
   A.ID IS NULL OR B.ID IS NULL



Responder

03/08/2006

Btovix

Seguinte, a lógica é essa mesmo... mas eu tenho um problema com sintaxe, meu MySQL é a versão 4.0, ontem eu tive várias soluções mas para versões do MySQL mais novas que a que eu sou obrigado a usar...

se vc souber como resolver pra versão 4.0 ou mesmo um link pra eu dar uma olhada já vai ajudar bastante...

um abraço e muito obrigado pela ajuda!!


Responder

04/08/2006

Dmalta

OK, MySQL 4.0 não tem [b:8c096ec35c]FULL JOIN[/b:8c096ec35c], mas tem LEFT JOIN, certo? Então é só separar a consulta em duas partes usando [b:8c096ec35c]LEFT / RIGHT JOIN[/b:8c096ec35c] e um [b:8c096ec35c]UNION[/b:8c096ec35c] para juntar as partes:

SELECT ´A´ AS Tabela, A.ID
FROM A LEFT JOIN B ON A.ID = B.ID 
WHERE B.ID IS NULL

UNION ALL

SELECT ´B´ AS Tabela, B.ID
FROM A RIGHT JOIN B ON A.ID = B.ID 
WHERE A.ID IS NULL

O primeiro select pega as linhas de A que não existem em B e o segundo pegas as linhas de B que não existem em A.

Também pode-se usar os predicados (NOT) EXISTS e (NOT) IN, mas eu acho mais confuso.

Um abraço!


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar