• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

psicotic

Duvida numa pesquisa

8 mensagens neste tópico

Tenho que resolver a seguinte pesquisa:

Escreva uma consulta que apresente o BI e o nome dos alunos com exame marcado para a categoria A e

que já reprovaram anteriormente mais que uma vez nesta categoria.

Este é o código que fiz para resolver a pergunta:

SELECT bialuno,nome

From Inscricao, Aluno

Where bi=bialuno

AND 1<(SELECT COUNT(*)

      FROM Inscricao

      WHERE Resultadoexame='Reprovado'

      AND categoria='A'

      GROUP BY bialuno)

Podem dar-me opinioes sobre o código?

Se for preciso eu arranjo o pdf que tem as tabelas...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes mostrar o PDF? Preciso de saber qual e' a relacao entre as tabelas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Assim de cabeca deve ser algo do tipo...

SELECT bi, nome
FROM Alunos A
INNER JOIN Inscricao I
ON A.bi=I.bi
WHERE I.categoria='A'
AND (SELECT COUNT(*) FROM Inscricao WHERE resultado='R' AND categoria='A')>1

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ALUNO

BI                Nome                            Morada        DataNasc          ÚltimaCategoriaObtida              DataÚltimaCategoriaObtida                      TotalReprovações

10700007    Carlos Sousa      Rua das Tijoleiras    26-02-1976            NULL                                                    NULL                                                      2

10800008    Susana Costa            Rua da Beleza    29-08-1983          NULL                                                    NULL                                                      1

10900009    Filipe da Silva        Av. Vidal Pinheiro      01-01-1967          C                                                  05-02-2008                                                  0

CodInscricao          Data        Paga              DataPagamento              Categoria    BIAluno    IdExame    ResultadoExame

7089              08-09-2007    S        08-09-2007                                        C      10900009      10901    Aprovado

7090            10-10-2007      S          04-01-2008                                      A      10700007      10900    Reprovado

7091              10-10-2007        S          03-12-2007                                    C      10800008    10901    Reprovado

7092              19-11-2007        N          NULL                                              B      11100000      NULL    NULL

7093                11-01-2008      S            12-01-2008                                  A      10700007      10902    Reprovado

7094              16-01-2008        N          NULL                                            A      10900009      10902    NULL

7095              08-02-2008      N            NULL                                            A      10700007      NULL        NULL

ID                      Local                                    Data              Categoria

10809              Estádio da cidade                      04-01-2008    C

10900              Estádio da cidade                        04-01-2008    A

10901            Escola                                        05-02-2008      C

10902              Estádio da cidade                        07-02-2008    A

10903                Escola                                      09-02-2008    A

10904              Centro de Testes Automóveis    09-02-2008    B

Sao estas as tres tabelas que tenho. Se nao der para perceber deixa o  teu mail que eu mando o rar com os ficheiros.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui vai:

Nota: chamei 'a primeira tabela de Alunos, 'a segunda de Inscricao e 'a ultima de Exames

SELECT A.BIAluno, A.Nome
FROM Alunos A
INNER JOIN Inscricao I
ON A.BIAluno=I.BIAluno
GROUP BY I.ResultadoExame, A.BIAluno, A.Nome
HAVING COUNT(*)>1
WHERE I.Categoria='A' AND I.ResultadoExame LIKE 'Reprovado'

Suponho que seja algo assim do genero.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado :P.

Nao querendo abusar da paciencia, a consulta nao dava para fazer utilizando subconsultas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu estou mesmo mesmo mesmo mesmo MESMO a sair do trabalho, por isso vou ser breve:

E' capaz de dar mas isso para alem de nao ser muito produtivo, e' uma ma' implementacao. Basicamente o engine da base de dados esta optimizado para fazer esse trabalho por ti. Se tu tentas 'ajudar' o engine, so pioras as coisas.

E para te ser sincero, eu ja estou tao habituado a fazer as minhas queries de uma maneira eficiente que nao sei hmmm... regredir.

Mas sim, e' bem provavel que sim... terias de fazer algo do tipo:

SELECT A.BIAluno, A.Nome
FROM Alunos A
INNER JOIN Inscricao I
ON A.BIAluno=I.BIAluno
WHERE 
I.Categoria='A' AND I.ResultadoExame LIKE 'Reprovado'
AND (SELECT COUNT(*) FROM Inscricao WHERE I.Categoria='A' AND I.ResultadoExame LIKE 'Reprovado' AND BIAluno=A.BIAluno) > 1

PS: Esta query nao leva selo de garantia. Nem sei se funciona assim...

Como ves, na sub-query estas a usar de novo as mesmas WHERE clauses que usaste em cima, por isso torna-se redundante o seu uso.

Existem casos em que podes e deves usar sub-queries. Este nao e' o caso.

Por exemplo, se quisesses saber o numero de alunos com uma nota superior 'a media, entao ai sim, justifica-se o uso de uma sub-query para determinares essa mesma media. A sub-query da tua query original

SELECT bialuno,nome
From Inscricao, Aluno
Where bi=bialuno
AND 1<(SELECT COUNT(*)
       FROM Inscricao
       WHERE Resultadoexame='Reprovado'
       AND categoria='A'
       GROUP BY bialuno)

devolve mais do que um registo e portanto nao podes validar um grupo de registos contra apenas um numero.

Espero que me tenha feito entender. Nem reli o meu topico porque estou mesmo cheio de pressa.

Abraco.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora