Esercizio SQL

di Anonimizzato16969 il
7 risposte
Salve a tutti , sono blocatto sul seguente esercizio d'esame di Basi:
Ho le seguenti entità:
Insegnamento (Num_insegnamento,Cod_docente,Aula,Argomento)

Docenti(Cod_docente,nome,cognome,n_ufficio,n_telefono)

Frequenta(Num_insegnamento,matricola)

Num_insegnamento è PK di insegnamento , Cod_docente è FK
Cod_docente è PK di docente
La combinazione (Num_insegnamento,matricola) è PK per frequenta.
Ogni insegnante può tenere piu insegnamenti ma un insegnamento può essere tenuto da un solo insegnante

Si chiede di determinare tramite opportune query SQL :
- Tutti gli studenti che seguono tutte le lezioni del prof Cecconi e nessuna del prof Rossi.

Se qualcuno me lo risolve o mi da dei suggerimenti sarebbe ottimo. Grazie

7 Risposte

  • Non mi risulta che in questo forum si facciano i compiti per gli altri.
    Se speri di superare un esame in questo modo... Auguri!
  • Come scritto da gibra non si risolvono esercizi completi.

    Comunque ti servono, in ordine sparso COUNT, GROUP BY, NOT IN e HAVING.
  • Ma non capisco allora a che serve un forum? Non ci voleva molto a capire quali funzioni usare , è come combinarle il problema. Secondo non chiedo come si dice nel regolamento "la pappa pronta" perchè ho ben provato a risolvere l'esercizio da me. Terzo si tratta di un testo d'esame vecchio , non violerete qualche codice universitario nel risolverlo ,non mi state "aiutando a passare l'esame" ma a risolvere un esercizio a caso. Almeno darmi una descrizione a parole della soluzione del problema , ripeto a capire di usare le having le aggregate group by e le in non ci voleva molto. Non importa il codice SQL quanto meno un'aiuto che non sia una lista di funzioni , grazie.
  • Allora se hai provato a farlo posta la query e vediamo cosa non va. Se non ci dai una base, e non ti basta sapere quali funzioni usare, che suggerimenti possiamo darti?
  • Allora per quanto riguarda quelli che non hanno fatto nessuna lezione con Russi son riuscito. Il problema è quello di selezionare gli studenti che hanno fatto tutti gli esami di Cecconi. La mia idea era di fare una lista di tutti gli studenti che seguono almeno un corso con Cecconi e il relativo corso, per ciascuno studente contare il numero di corsi con Cecconi (quindi Count(corso) groupby(matricola)) e confrontarli con il numero di corsi(precedentemente conteggiati) del prof Cecconi. Una volta fatto sottraggo con EXCEPT tutti quelli che hanno fatto anche qualcosa con Russi e dovrebbe venire. Questo è il problema, tenere in qualche modo "memorizzato" il numero di lezioni di Cecconi e confrontarlo con le lezioni che gli studenti seguono di Cecconi (per vedere se sono uguali e quindi le seguono tutte). Dopo provo anche a scrivere quello che riesco di codice SQL.
  • Gli operatori insiemistici sono visti male da alcuni prof, quando ci sono alternative, e in questo caso l'alternativa è usare NOT IN.
    Dunque, per prima cosa si effettua il più possibile una scrematura nella clausola WHERE, selezionando così gli studenti che hanno seguito almeno un corso di Cecconi e nessun corso di Rossi (ovvero quelli che NON SONO TRA gli studenti che hanno seguito almeno un corso di Rossi).
    Ora, ad ogni studente del result set parziale sono associati solo corsi di Cecconi, quindi puoi contarli con un COUNT(*) dopo aver aggregato le tuple con la GROUP BY matricola.
    Per confrontare questo conteggio con il totale dei corsi di Cecconi, e selezionare solo gli studenti che hanno seguito tutti i corsi, devi sfruttare la clausola HAVING.

    Quindi hai bisogno di 2 query nidificate, una nella where e una nella having.
  • Perfetto credo di aver capito grazie
Devi accedere o registrarti per scrivere nel forum
7 risposte