Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 42
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    [SQL] Comprendere una query

    Date le tabelle create con le seguenti istruzioni:

    create table Studenti (matricola numeric not null primary key, cognome char(20) not null,
    nome char(20) not null, eta numeric not null);

    create table Esami (codiceCorso numeric not null, studente numeric not null references Studenti(matricola), data date not null, voto numeric not null, primary key (codiceCorso, studente, data))

    Si supponga che vengano registrati anche gli esami non superati, con voti inferiori
    al 18. Formulare in SQL l’interrogazione che trova i nomi degli studenti che hanno superato almeno due esami.

    La soluzione proposta è:

    select distinct s.nome, s.cognome
    from Studenti s, Esami e1 join Esami e2 on (e1.studente = e2.studente)
    where e1.codiceCorso > e2.codiceCorso and e1.voto >= 18 and e2.voto >= 18 and
    s.matricola = e1.studente;

    Sinceramente non la capisco molto.
    Per esempio cosa succede con questa istruzione:

    from Studenti s, Esami e1 join Esami e2 on (e1.studente = e2.studente)?

    La tabella studenti viene *joinata* con Esami in maniera implicita tramite quel s.matricola = e1.studente, perché non fare direttamente un triplo join (ammesso che sia utile)?
    E perché mi fa il join di Esami con Esami?
    E ancora, perché e1.codiceCorso > e2.codiceCorso and e1.voto >= 18 and e2.voto >= 18 ?
    Si poteva fare in un modo più semplice da comprendere?
    Grazie a chiunque vorrà rispondermi.



    Ultima modifica di Jamie04; 21-07-2016 a 20:08

  2. #2
    che minestrone! una join implicita e una esplicita... sì, certo, si poteva fare quantomeno più leggibile -- prova a scriverla di tuo pugno, poi la si controlla assieme

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    ma in pratica il mio libro fa cagare XD
    dunque io avevo pensato di farla così:

    select cognome, nome, count(*) as nr
    from Studenti join Esami on matricola=studente
    where voto>=18
    having nr>=2;

    Pensavo che funzionasse ma poi mi sono accorta che era solo un caso fortuito. Nella colonna nr mi restituisce il numero di studenti che hanno preso più di 18 a qualche esame. In pratica la clausola having viene ignorata da quel che mi è dato capire (perché? viene valutata solo se c'è un group by?); ed essendo che il count(*) restituisce un unico valore l'effetto è che select nome, cognome mi restituisce semplicemente il primo record che incontra nella tabella costruita dalla from.
    Il ragionamento che avevo fatto per elaborare la query è questo: devo contare quante volte uno studente compare nella tabella esami con un voto superiore al 18 e vedere se questo accade almeno 2 volte.

    Ok credo di averla modificata in modo che funzioni correttamente:

    select cognome, nome, count(*)
    from Studenti join Esami on matricola=studente
    where (voto>=18)
    group by cognome, nome
    having count(*)>=2;

    Ovviamente si potrebbe dire che non rispetta completamente le specifiche dell'esercizio perché restituisce un valore che non era richiesto (il numero di esami superati, mentre si richiede solo il nome ed il cognome).
    Vuoi ridere? La soluzione proposta dal libro è anche sbagliata perché restituisce solo studenti che hanno superato PIU' di 2 esami.
    Ultima modifica di Jamie04; 22-07-2016 a 12:44

  4. #4
    metti voto>=18 nella join, metti group by, metti having count(*)>2

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    forse non hai letto con attenzione il mio messaggio...

  6. #6
    forse ho risposto prima che correggessi. comunque adesso tuttapposhto?

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Scusa! Mi era venuto il dubbio ma ho guardato l'ora della mia modifica e quella del tuo messaggio e mi sembrava fossero distanti.
    Tutto a posto? Uhm, sì e no, nel senso che rimango nella mia non-comprensione della query originale!

  8. #8
    quella originale, cioè quella del libro?

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    sì, questa:
    select distinct s.nome, s.cognome
    from Studenti s, Esami e1 join Esami e2 on (e1.studente = e2.studente)
    where e1.codiceCorso > e2.codiceCorso and e1.voto >= 18 and e2.voto >= 18 and
    s.matricola = e1.studente;

  10. #10
    vuoi comprenderla nonostante sia mal concepita, malformata e probabilmente non funzionante?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.