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

Vitor_Alves

Ajuda em SQL/DML

5 mensagens neste tópico

Estou com algumas dificuldades em executar uma consulta em SQL/DML :wallbash:

Tenho o seguinte esquema relacional:

faculdade(cod_fac, sigla, nome, cidade)                onde cod_fac e chave primaria

disciplina(cod_disc, nome, creditos)                        onde cod_disc e chave primaria

lecciona(faculdade.cod_fac, disciplina.cod_disc)    onde cod_fac e cod_disc sao ambas chaves primarias

Pretendo saber quais sao as disciplinas que nao sao leccionadas por nenhuma faculdade do Porto.

(De preferencia, sem o utilizar os comandos UNION e INTERSECT e sem usar sub-querys na clausula FROM)

Obrigado pela atencao  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

SELECT DISTINCT disciplina.nome

FROM lecciona, faculdade, disciplina

WHERE lecciona.cod_fac = faculdade.cod_fac

AND lecciona.cod_disc = disciplina.cod_disc

AND cidade <> 'Porto';

Tentei isto e nao resultou : (

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mysql> select * from faculdade;
+---------+-------+------+--------+
| cod_fac | sigla | nome | cidade |
+---------+-------+------+--------+
|       1 |       |      | porto  |
|       2 |       |      | porto  |
|       3 |       |      | lisboa |
|       4 |       |      | aveiro |
+---------+-------+------+--------+
4 rows in set (0.00 sec)

mysql> select * from disciplina;
+----------+--------+----------+
| cod_disc | nome   | creditos |
+----------+--------+----------+
|        1 | um     |        0 |
|        2 | dois   |        0 |
|        3 | tres   |        0 |
|        4 | quatro |        0 |
+----------+--------+----------+
4 rows in set (0.00 sec)

mysql> select * from lecciona;
+---------+----------+
| cod_fac | cod_disc |
+---------+----------+
|       1 |        1 |
|       1 |        2 |
|       2 |        2 |
|       2 |        3 |
|       3 |        3 |
|       3 |        4 |
|       4 |        4 |
+---------+----------+
7 rows in set (0.00 sec)

mysql> select disciplina.nome
    -> from faculdade
    -> left join lecciona on faculdade.cod_fac=lecciona.cod_fac
    -> right join disciplina on lecciona.cod_disc=disciplina.cod_disc
    -> and faculdade.cidade = 'porto'
    -> group by disciplina.nome
    -> having count(faculdade.cidade) = 0;
+--------+
| nome   |
+--------+
| quatro |
+--------+
1 row in set (0.00 sec)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Muito obrigado, resultou!:P Não querendo abusar, não percebi como é que seleccionando a cidade 'Porto' e a contagem das cidades a 0, o programa devolve todas as outras cidades. E se quisessemos por ex, todas as discilplinas que são leccionadas em todas as faculdades de Lisboa mas em nenhuma do Porto?

Obrigado mais uma vez

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta tirar "coisas" ao meu query ...

original) select disciplina.nome from faculdade left join lecciona on faculdade.cod_fac=lecciona.cod_fac right join disciplina on lecciona.cod_disc=disciplina.cod_disc and faculdade.cidade = 'porto' group by disciplina.nome having count(faculdade.cidade) = 0;

com select *) select *disciplina.nome from faculdade left join lecciona on faculdade.cod_fac=lecciona.cod_fac right join disciplina on lecciona.cod_disc=disciplina.cod_disc and faculdade.cidade = 'porto' group by disciplina.nome having count(faculdade.cidade) = 0;

sem having) select * from faculdade left join lecciona on faculdade.cod_fac=lecciona.cod_fac right join disciplina on lecciona.cod_disc=disciplina.cod_disc and faculdade.cidade = 'porto' group by disciplina.nome having count(faculdade.cidade) = 0;

sem group by) select * from faculdade left join lecciona on faculdade.cod_fac=lecciona.cod_fac right join disciplina on lecciona.cod_disc=disciplina.cod_disc and faculdade.cidade = 'porto' group by disciplina.nome;

sem porto) select * from faculdade left join lecciona on faculdade.cod_fac=lecciona.cod_fac right join disciplina on lecciona.cod_disc=disciplina.cod_disc and faculdade.cidade = 'porto';

E se quisessemos todas as discilplinas que são leccionadas em todas as faculdades de Lisboa mas em nenhuma do Porto?

sem o utilizar os comandos UNION e INTERSECT e sem usar sub-querys na clausula FROM?

Hmmmm ... isso é mais complicado :P

Com um sub-query é mais ou menos fácil -- mas deixo seres tu a fazer LOL

select todas as disciplinadas seleccionadas em Lisboa
where disciplina
NOT IN
select todas as disciplinas seleccionadas no Porto

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