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

Solução diferente da resposta do instrutor

Bom dia a todos,

No exercício "Exiba a média das notas por curso." A minha resposta está diferente da resposta do instrutor, analisando vi que a resposta do instrutor está omitindo dados que deveriam estar no retorno da consulta, como por exemplo : "Cristaldo Santos" e "Manoel Santos".

Segue minha resposta:

select c.nome "Curso", round(AVG(n.nota)) "Média", a.nome "Nome aluno"
from nota n, resposta r, exercicio e, secao s, curso c, matricula m, aluno a
where r.id = n.resposta_id
and e.id = r.exercicio_id
and s.id = e.secao_id
and c.id = s.curso_id
and m.aluno_id = a.id
and m.curso_id = c.id
and a.nome like '%Silva%'
or a.nome like '%Santos%'
group by c.nome, a.nome
order by a.nome;

Resposta do instrutor:

select c.nome, avg(n.nota) as media from nota n
    join resposta r on r.id = n.resposta_id
    join exercicio e on e.id = r.exercicio_id
    join secao s on s.id = e.secao_id
    join curso c on c.id = s.curso_id
    join aluno a on a.id = r.aluno_id
where a.nome like '%Santos%' or a.nome like '%Silva%'
group by c.nome;

Gostaria de saber se a consulta que eu fiz está correto.

obs: A minha consulta está demorando 57 seg pra ser retornada. Como faço pra melhorar esse tempo?

obg

3 respostas

Olá Francisco,

No caso da sua consulta, como você já está fazendo o relacionamento diretamente no where ao invés de join, como no exercício, a sua cláusula de nomes deverá estar entre parênteses.

select c.nome "Curso", round(AVG(n.nota)) "Média", a.nome "Nome aluno"
from nota n, resposta r, exercicio e, secao s, curso c, matricula m, aluno a
where r.id = n.resposta_id
and e.id = r.exercicio_id
and s.id = e.secao_id
and c.id = s.curso_id
and m.aluno_id = a.id
and m.curso_id = c.id
and (a.nome like '%Silva%'
or a.nome like '%Santos%')
group by c.nome, a.nome
order by a.nome;

Da forma que o exercício do instrutor foi desenvolvido, somente retornarão alunos que tenham os relacionamentos com os exercícios / respostas, etc..

No caso da sua consulta, este relacionamento só estaria valendo para alunos com nome Silva, sendo que o Santos traria todo registro de aluno, independente de ter o relacionamento. Incluindo o parênteses soluciona esta inconsistência.

Olá Harley,

Obrigado pela resposta!

Eu inseri os parênteses , e a consulta ficou mais rápido e retornou uma quantidade menor do anteriormente.

Porém comparando a minha consulta(com os parênteses) com a do instrutor, está retornando uma quantidade diferente de linhas. E foi isso que não consegui entender o porque.

solução!

Então Francisco.. tudo vai depender dos dados que estão inseridos em sua base com relação à base de dados do instrutor, que pode ter variado em algum registro de teste que você possa ter inserido adicional, ou deixado de inserir.. é uma possibilidade.. outro caso que vi que tem divergência entre a sua consulta e a do instrutor é o seu relacionamento com a tabela de matrícula.

Avalie se os dados estão consistentes e tente também retirar o relacionamento e avaliar os resultados, ok?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software