Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Aiuto query esercizio per esame Basi di dati

    Ciao a tutti ragazzi
    Sto cercando di svolgere questi temi d'esame, chiaramente non senza difficolt�.
    Ma il tempo non � amico e avrei bisogno di una mano per la risoluzione di queste query.

    DATO LO SCHEMA:
    STUDENTE(Email, Nome, Cognome, AnnoImmatricolazione)
    MAILING_LIST(EmailStudente, CodCorso)
    CORSO(Codice, Nome, Anno)

    ESERCIZIO 3) Scrivere in SQL la query che determina, tra tutti i corsi del terzo anno,
    quello (o quelli, in caso di parit�) avente/i il maggior numero di iscritti. Restituire
    codice e nome del corso/i in questione. [VINCOLO: Non � possibile usare l�operatore
    di HAVING]

    Io ho creato una vista ma non so se � corretta cos� com'�
    e non saprei come ovviare al vincolo del "non uso" dell'having
    C'� un altro modo per scriverla senza viste/having?

    Create view anno3iscritti(codcorso,nIscritti)
    as select codcorso, count(*)
    from mailing list
    group by codcorso

    select codcorso
    from anno3iscritti
    having max(iscritti)> (select max(nIscritti)
    from anno3iscritti)
    _______________________________________________

    ESERCIZIO c) Scrivere in SQL la query che determina email, nome e cognome degli
    studenti iscritti ad ALMENO due corsi del primo anno.
    [VINCOLO: Non � possibile usare l�operatore di COUNT].

    anche qui il vincolo mi da parecchi problemi.
    Io l'ho scritta cos� ma, ripeto, anche qui non saprei come muovermi col vincolo.

    Select email, nome, cognome
    from studente
    where email in(select emailstudente
    from mailing list ML, corso C
    where ML.codcorso=C.codice
    and C.anno='1'
    group by emailstudente
    having count(*)>=2
    __________________________________________________ __

    Help me please

  2. #2
    help me please!

  3. #3
    se non puoi usare HAVING (ma perché questo sadismo?) credo che l'unica sia di andare di sub-query, del tipo

    SELECT * FROM
    (SELECT COUNT(qualcosa) AS Contatore FROM tabella GROUP BY qualcosaltro) AS T1
    WHERE Contatore>2

    prova...

  4. #4
    Guest
    Registrato dal
    Jun 2012
    residenza
    Espoo, Finland
    Messaggi
    286
    Primo quesito:
    Non hai specificato il database. Con alcuni database puoi evitare ripetizione di subquery in questo modo:

    codice:
    WITH blah 
         AS (SELECT c1.codice, 
                    Count(*) AS countIscrittiPerCorso 
             FROM   corso c1 
                    JOIN mailing_list m1 
                      ON m1.codcorso = c1.codice 
                    JOIN studente s1 
                      ON s1.email = m1.emailstudente 
             GROUP  BY c1.codice) 
    SELECT codice, 
           nome 
    FROM   corso 
    WHERE  anno = 3 
           AND codice IN (SELECT codice 
                          FROM   blah 
                          WHERE  countiscrittipercorso = 
                                 (SELECT Max(countiscrittipercorso) 
                                  FROM   blah))
    Per i database che non supportano 'with' devi ripetere la subquery:

    codice:
    FROM   corso 
    WHERE  anno = 3 
           AND codice IN (SELECT codice 
                          FROM   (SELECT c1.codice, 
                                         Count(*) AS countIscrittiPerCorso 
                                  FROM   corso c1 
                                         JOIN mailing_list m1 
                                           ON m1.codcorso = c1.codice 
                                         JOIN studente s1 
                                           ON s1.email = m1.emailstudente 
                                  GROUP  BY c1.codice) AS blah 
                          WHERE  blah.countiscrittipercorso = 
                                 (SELECT 
                                 Count(c.codice) 
                                                               FROM   corso c 
                                                                      JOIN 
                                 mailing_list m 
                                                                        ON 
                                 m.codcorso = 
                                 c.codice 
                                 JOIN studente s 
                                   ON 
                                 s.email = m.emailstudente 
                                  GROUP  BY c.codice 
                                  ORDER  BY Count(c.codice) 
                                            DESC 
                                  LIMIT  1))
    MySQL standard non supporta "with" ma MariaDB, Oracle e altri si'.
    Queste query le ho scritte molto velocemente perche' devo cenare.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.