Ir para conteúdo

POWERED BY:

Arquivado

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

acdestefani

Consulta entre 3 tabelas

Recommended Posts

Olá!

 

Tenho uma consulta entre 3 tabelas (candidatos, sorteados e dependentes).

 

A consulta abaixo me retorna os candidatos que possuem registro na tabela dependentes e que não possuem registro na tabela sorteados.

 

SELECT candidatos.codigo
FROM candidatos 
       RIGHT JOIN dependentes ON candidatos.codigo = dependentes.codigocandidato 
LEFT JOIN sorteados ON candidatos.codigo = sorteados.codigocandidato WHERE sorteados.codigocandidato IS NULL 
AND (candidatos.recadastramento >= '2009' OR candidatos.datainscricao >= '2009-04-04')
AND (candidatos.remuneracaocandidato + candidatos.remuneracaoconj) between ('5') AND ('22035')
AND candidatos.codigo between ('5') and ('22035')	
GROUP BY candidatos.codigo

Agora estou precisando fazer uma consulta que me retorne os candidatos que não possuem registro nem na tabela dependentes e nem na tabela sorteados.

 

Poderiam me ajudar a resolver isso?

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela ajuda Andrey Knupp!

 

Já tentei fazer isso:

SELECT candidatos.codigo
       FROM candidatos 
       LEFT JOIN dependentes ON candidatos.codigo = dependentes.codigocandidato WHERE dependentes.codigocandidato IS NULL
       LEFT JOIN sorteados ON candidatos.codigo = sorteados.codigocandidato WHERE sorteados.codigocandidato IS NULL 
       AND (candidatos.recadastramento >= '2009' OR candidatos.datainscricao >= '2009-04-04')
       AND (candidatos.remuneracaocandidato + candidatos.remuneracaoconj) between ('5') AND ('22035')
       AND candidatos.codigo between ('5') and ('22035')       
       GROUP BY candidatos.codigo

 

Mas dá o seguinte erro:

 

#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 'LEFT JOIN sorteados ON candidatos.codigo = sorteados.codigocandidato WHERE sorte' at line 4

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá errado, você não aplica a condição ali, a cláusula where não entra no JOIN.

Veja como deveria ser:

SELECT candidatos.codigo FROM candidatos 
LEFT JOIN dependentes ON candidatos.codigo = dependentes.codigocandidato AND dependentes.codigocandidato IS NULL
LEFT JOIN sorteados ON candidatos.codigo = sorteados.codigocandidato WHERE sorteados.codigocandidato IS NULL 
AND (candidatos.recadastramento >= '2009' OR candidatos.datainscricao >= '2009-04-04')
AND (candidatos.remuneracaocandidato + candidatos.remuneracaoconj) between ('5') AND ('22035')
AND candidatos.codigo between ('5') and ('22035')       
GROUP BY candidatos.codigo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com relação a tabela sorteados, a consulta está correta, não está listando os candidatos da tabela sorteados. Agora com relação a tabela dependentes, não está funcionando corretamente. A consulta está retornando alguns candidatos que possuem cadastros na tabela dependentes. Tem idéia do que pode ser?

 

Mais uma vez, obrigado pela ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta mais ou menos assim

 

SELECT 
       candidatos.codigo
FROM 
       candidatos 
where
       not exists(select 1 from dependentes, sorteados where dependente.codigocandidato = candidatos.codigo or sorteados.codigocandidato = candidatos.codigo)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, veja a situação

mysql -u root -p
Enter password: ************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 57
Server version: 5.5.16 MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create schema imasters ;
Query OK, 1 row affected (0.06 sec)

mysql> use imasters ;
Database changed
mysql> create table candidatos ( codigo integer not null ) ;
Query OK, 0 rows affected (0.45 sec)

mysql> create table dependentes ( codigo integer not null ) ;
Query OK, 0 rows affected (0.08 sec)

mysql> create table sorteados ( codigo integer not null ) ;
Query OK, 0 rows affected (0.13 sec)

mysql> insert into candidatos values ( 1 ) , ( 2 ) , ( 3 ) , ( 4 ) , ( 5 ) ;
Query OK, 5 rows affected (0.16 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> insert into dependentes values ( 2 ) , ( 3 ) ;
Query OK, 2 rows affected (0.05 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into sorteados values ( 4 ) , ( 3 ) , ( 1 ) ;
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select c.codigo from candidatos c left join dependentes d on c.codigo = d.codigo left join sorteados s
on c.codigo = s.codigo where d.codigo is null and s.codigo is null ;
+--------+
| codigo |
+--------+
|      5 |
+--------+
1 row in set (0.00 sec)

mysql>

 

Não está correta ? você disse: todos os candidatos que NÃO estão em Sorteados ou Dependentes.

Eu inseri 5 candidatos { 1 , 2 , 3 , 4 , 5 }.

O candidato 2 e 3 em dependentes e o candidato 4, 3 e 1 em sorteados, portanto só sobrou o 5 (como esperado).

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.