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

Exercício 4 aula 1

"Busque todos os alunos que não tiveram nenhuma matrícula no último ano"

O que entendi do enunciado?

Que devo listar alunos que não se matricularam no ano de 2015.

Fiz a seguinte query:

select a.id, a.nome from aluno a where exists (select m.id from matricula m where not m.data between '01-JAN-2015' and '31-DEZ-2015' and a.id = m.aluno_id);

Essa query retornou 5 linhas em que as matriculas não foram feitas em 2015. Porém percebi que algumas dessas 5 ocorrências possuem matrícula em 2014 e também em 2015 não sendo essa a melhor solução.

Enviei a resposta para obter a opinião do instrutor que é a seguinte:

select a.nome from aluno a where not exists (
    select m.id from matricula m where m.aluno_id = a.id and 
    m.data > (select sysdate - interval '1' year from dual));

Copiei e colei a query e ela retorna 16 linhas:

        ID NOME
---------- ----------------
         5 Paulo da Silva
         8 Manoel Santos
         3 Alberto Santos
        15 Osmir Ferreira
        12 Danilo Cunha
        10 Paula Soares
         7 Paulo Jose
         4 Renata Alonso
        14 Cristaldo Santos
        16 Claudio Soares
         9 Renata Ferreira

        ID NOME
---------- ----------------
        13 Zilmira Jose
         1 Joao da Silva
         2 Frederico Jose
        11 Jose da Silva
         6 Carlos Cunha

Onde já percebo que o aluno com ID 3 possuí matrícula em 2015:

        ID   ALUNO_ID   CURSO_ID DATA     TIPO
---------- ---------- ---------- -------- ------------
         1          1          1 25/11/14 PAGA_PF
         2          2          1 25/05/15 PAGA_PJ
         3          3          3 21/07/15 PAGA_PF
         4          4          4 15/05/15 PAGA_CHEQUE
         5          7          1 10/03/15 PAGA_BOLETO
         6          8          3 05/05/14 PAGA_PJ
         7          9          2 07/02/15 PAGA_PF
         8         10          7 15/01/15 PAGA_PJ
         9          4          7 08/07/14 PAGA_PJ
        10          8          1 01/06/14 PAGA_CHEQUE
        11          1          4 10/11/14 PAGA_BOLETO

        ID   ALUNO_ID   CURSO_ID DATA     TIPO
---------- ---------- ---------- -------- ------------
        12          2          4 01/10/14 PAGA_PJ
        13          3          4 15/11/14 PAGA_PF
        14          2          2 04/01/15 PAGA_PJ

Gostaria de uma orientação... não entendi muito bem a solução ou talvez o enunciado.

Obrigado!

4 respostas

O problema da sua solução é que você busca todas as matriculas que não estão no período de 2015, o problema está quando você faz esse comando where exists ou seja você quer os alunos que tem matriculas que não estejam em 2015, mas se ele tive em 2014 vai pegar, pois o existe procura por uma ocorrência. O que você quer é excluir os alunos que tiveram matriculas em 2015 por isso not exists. Porém a query do instrutor busca por alunos que não tenham matricular em 2016, pois ele coloca o intervalo de um ano atrás, se você colocar a data como na sua query deveria funcionar.

Olá Marcio obrigado pela ajuda!

Ainda estou com a mesma dúvida com relação ao enunciado do exercício. Acho que ele está incorreto... o que você acha?

A query do instrutor, na minha opinião, também está com problemas, retornando tuplas de 2015.

Alguém mais poderia dar uma olhada? Como entro em contato com o instrutor?

Obrigado!

solução!

A questão diz: "Busque todos os alunos que não tiveram nenhuma matrícula no último ano", para essa questão a query está certa, mas concordo que não faz sentido pois no banco só tem matriculas até 2015. Vou relatar o problema aqui para corrigirem a questão.

A query retorna certo, pois todos os alunos retornados tem matriculas até 2015, e ao passado foi 2016. Mas acho que o certo seria a questão retirar os alunos com matriculas em 2015 e assim teria que corrigir a resposta também.

Você teve uma interpretação baseada no tempo corrente... eu imaginei que em um banco com ultimo ano em 2015 que a query deveria retornar somente linhas com ano <=2014 sendo 2015 o ultimo ano.

Pensando das duas formas acho que a questão está com problemas.

Obrigado Marcio!