Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Exists com Join mostra resultados diferentes

Olá, estava testando e tentei adicionar um Join em uma instrução do professor, porém obtive um resultado diferente e não entendi o que houve, por favor me ajudem a entender, segue o que fiz:

select a.nome, m.data from aluno a join matricula m on m.aluno_id = a.id where exists (select m.id from matricula m where m.aluno_id = a.id and m.data < now() - interval 45 day);

me trouxe:

+----------------+---------------------+
| nome           | data                |
+----------------+---------------------+
| João da Silva  | 2013-11-25 16:16:05 |
| Frederico José | 2013-05-25 16:16:25 |
| Alberto Santos | 2013-07-21 16:16:30 |
| Renata Alonso  | 2013-11-15 16:15:35 |
| Frederico José | 2012-01-04 00:00:00 |
+----------------+---------------------+
5 rows in set (0.00 sec)

e

 select a.nome from aluno a where exists (select m.id from matricula m where m.aluno_id = a.id and m.data < now() - interval 45 day);

me trouxe:

+----------------+
| nome           |
+----------------+
| João da Silva  |
| Frederico José |
| Alberto Santos |
| Renata Alonso  |
+----------------+
4 rows in set (0.00 sec)

Esse segundo foi um exercicio do professor, vejam q o nome Frederico repetiu em duas datas diferentes no primeiro caso que tentei adicionar o join com o exists...

como poderia fazer isso sem que duplicasse...

4 respostas
solução!

Oi Smagnum,

Como você fez um join, se o aluno tiver mais de uma matricula será retornado um registro para cada matricula.

No seu caso veio o aluno Frederico 2 vezes, pois ele deve ter 2 registros de matriculas.

Para não trazer repetido, você pode utilizar o operador DISTINCT, da seguinte maneira:

select DISTINCT(a.nome), m.data from aluno a join matricula m on m.aluno_id = a.id where exists (select m.id from matricula m where m.aluno_id = a.id and m.data < now() - interval 45 day);

vamos ver se entendi,

se eu usar o join se faz necessário o uso do distinct para não mostrar o nome repetido, porém se eu usar o exists não preciso usar o distinct...

estou certo?

Isso mesmo.

O exists apenas retorna se existe algum registro, independente da quantidade.

Já o join vai fazer a junção entre as tabelas e para cada combinação encontrada, retornará um registro.

perfeito, agora está claro, obrigado