DOMANDA Aiuto Query mysql

Pubblicità

andrealoppini

Nuovo Utente
Messaggi
1
Reazioni
0
Punteggio
20
Buonasera a tutti! Sono uno studente di informatica tra qualche settimana ho il mio esame di basi di dati. Avrei qualche dubbio che spero possiate aiutarmi a chiarire.
Il mio professore ci ha dato questo compito (allegato)
Lo schema sarebbe

materiale(nome,funzionante,n.aula)
aula(nome,posti,corso)
corsolaurea(corso,descrizione,presidente)

La mia domanda era sopratutto sulla seconda query chiesta ovvero:
selezionare tutte le aule che appartengono allo stesso corso di laurea a cui è affidata l’ aula 3A, riportando la descrizione del corso ed il suo presidente.
Il mio problema è che lui non vuole che vengano utilizzate select nidificate ma io non so come altro farlo

Vi ringrazio per il vostro aiuto

Andrea
 

Allegati

  • Schermata 2017-06-29 alle 16.00.42.webp
    Schermata 2017-06-29 alle 16.00.42.webp
    60.6 KB · Visualizzazioni: 27
Io proporrei due left join. Il problema però è il nome che hai dato alle colonne: dopo il primo join la tabella risultante avrà colonne con lo stesso nome che diventano ambigue.
Premessa 1: è la prima cosa che mi viene in mente, funziona e risolve l'esercizio, probabilmente c'è di meglio.
Premessa 2: Io non uso Mysql ma postgres (e non sono comunque molto navigato), per cui la sintassi può essere un po' diversa per la fase di inserimento.
Codice:
create table corso (corso_nome varchar(32)not null primary key, corso_descrizione varchar(32), corso_presidente varchar(32));
create table aula (aula_nome varchar(12) not null primary key, aula_posti smallint not null, aula_corso varchar(32) not null references corso(corso_nome));

insert into corso values ('Analisi', 'Brutta cosa', 'Pinco Pallo');
insert into corso values ('Analisi 2', 'Bruttissima cosa', 'Pinco Pollo');
insert into corso values ('Complementi di Analisi 2', 'Are you kidding me?', 'Pinco Kiddo');

insert into aula values ('1A', 60, 'Analisi');
insert into aula values ('1B', 60, 'Analisi 2');
insert into aula values ('1C', 60, 'Analisi 2');
insert into aula values ('2A', 60, 'Complementi di Analisi 2');
insert into aula values ('2B', 60, 'Analisi');
insert into aula values ('2C', 60, 'Analisi');
insert into aula values ('3A', 60, 'Analisi 2');
L'idea è quella di denormalizzare le due tabelle in modo da arricchire ogni aula con descrizione e presidente del corso che serve.
Questa tabella va poi in right join (faccio right solo per comodità di spiegazione) con aula sul nome del corso così che si avranno tra le righe tutte le combinazioni (anche ripetute) aula-aula che condividono lo stesso corso.
Su questa tabella selezioni le righe che contengono '3A' su una delle due colonne "aula_nome".
In sostanza:
Codice:
select aula.aula_nome, corsoXaula.corso_descrizione, corsoXaula.corso_presidente from
   (aula inner join corso on (aula.aula_corso = corso.corso_nome)) as corsoXaula
   right join
   aula on (corsoXaula.corso_nome = aula.aula_corso)
where corsoXaula.aula_nome = '3A';
darà come risultato:
Codice:
aula_nome  corso_descrizione  corso_presidente
1B                Bruttissima Cosa       Pinco Pollo
1C                Bruttissima Cosa       Pinco Pollo
3A                Bruttissima Cosa      Pinco Pollo
che sono appunto le aule che servono lo stesso corso di 3A (Analisi 2)

Questa query è poco intelligente in quanto il join più esterno crea una tabella di dimensioni potenzialmente enormi anche con pochi dati (in questo semplice caso crea 19 righe), infatti sarebbe molto meglio usare select nidificati.

Qui puoi vedere come funziona la query che ti ho proposto: http://rextester.com/ETMOQ71358
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top