Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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!
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
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
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!
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)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).
Usa o left em sorteados e checa se é nulo da mesma forma que você faz com dependentes.