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

    [SQL] Esercizi da controllare! Corso di Basi di dati :-)

    Ciao a tutti,

    sto seguendo un corso di Basi di Dati e... non ci capisco granché.

    Mi sono stati dati questi 3 esercizi e io ci ho messo tutta la mia buona volontà, ma con scarsi risultati (Ho testato le soluzioni da me proposte su un server sql ed è da ieri che sbatto la testa contro errori che proprio non capisco!).

    Potete controllare cosa c'è di sbagliato? Grazie mille :-)

    Cominciamo con il primo

    Sono date le relazioni seguenti (le chiavi primarie sono sottolineate):

    PITTORE(CodP, NomeP, DataNascita, Nazione)
    QUADRO(CodQ, Titolo, CodP)
    ESPOSIZIONE(CodQ, DataInizio, DataFine, NomeGalleria)

    Per ogni nazione, visualizzare il codice del pittore che ha dipinto il numero massimo di
    quadri e il relativo numero di quadri dipinti.

    La soluzione da me proposta è:
    SELECT P.CodP, COUNT(Q.CodQ) AS NumQ, P.Nazione
    FROM Pittore P, Quadro Q
    WHERE P.CodP=Q.CodP
    GROUP BY CodP, Nazione
    HAVING MAX(NumQ)

    Inutile dire che non funziona... eppure a me sembra tutto corretto :O

    Idee?


    Continuiamo col secondo esercizio

    Sono date le relazioni seguenti (le chiavi primarie sono sottolineate):

    MAESTRO-SCI(CodFiscale, DataNascita, Residenza, Nome, Cognome)
    CORSO-SCI(CodC, Nome, Livello)
    CLASSE(CodC, NumClasse, NumIscritti)
    CALENDARIO-LEZIONI(CodC, NumClasse, Data, CodFiscale)

    Per le classi che hanno un numero di iscritti superiore alla media del corso a cui fanno
    riferimento, e che non sono mai state seguite da maestri nati prima del 1980, visualizzare il
    codice del corso, il numero della classe, la data della prima e dell'ultima lezione eff ettuata.

    Soluzione da me proposta:

    SELECT DISTINCT CodC, NumClasse, MIN(Data), MAX(Data)
    FROM CALENDARIO-LEZIONI
    WHERE CodC IN (
    SELECT CL.CodC
    FROM CALENDARIO-LEZIONI CL, MAESTRO-SCI MS
    WHERE CL.CodFiscale = MS.CodFiscale
    AND MS.DataNascita > 1980
    AND CL.CodC IN (
    SELECT CodC
    FROM CLASSE
    GROUP BY CodC
    HAVING NumIscritti > AVG(NumIscritti)
    ))

    Se qualcuno mi spiega dove ho sbagliato, gli sarò grato per l'eternità.

    Umberto

  2. #2
    mmmmh... Nessuno può aiutarmi :S

  3. #3
    Ma quali sono i nomi esatti delle tabelle? Ad esempio la prima, si chiama PITTORE, Pittore, o P?

    Seconda cosa, che ne dici di postare gli errori che ricevi così li correggiamo insieme?

  4. #4
    Allora, sì i nomi delle tabelle sono quelle indicati nelle relazioni. Quindi ad esempio il nome della prima è PITTORE.

    Cominciamo dal primo esercizio. La soluzione da me proposta ritorna come errore:

    #1054 - Unknown column 'NumQ' in 'having clause'

    Ma se elimino la clausola HAVING, l'interrogazione funzionae mi restituisce una tabella contenente le colonne CodP, Nazione e NumQ.

    Com'è possibile dunque che NumQ sia sconosciuta?????

  5. #5
    Per prima cosa, scusa la mia domanda, sono al lavoro e non sto testando il tuo codice, però se le tabelle si chiamano PITTORE, QUADRO, ESPOSIZIONE, perchè scrivi

    SELECT P.CodP, COUNT(Q.CodQ) AS NumQ, P.Nazione
    FROM Pittore P, Quadro Q
    WHERE P.CodP=Q.CodP
    GROUP BY CodP, Nazione
    HAVING MAX(NumQ)

    anzichè

    SELECT PITTORE.CodP, COUNT(QUADRO.CodQ) AS NumQ, PITTORE.Nazione
    FROM PITTORE, QUADRO
    WHERE PITTORE.CodP=QUADRO.CodP
    GROUP BY PITTORE.CodP, PITTORE.Nazione
    HAVING MAX(NumQ)

    ?

  6. #6
    Boh, nessuna ragione in particolare... suppongo che sia uno sclero da troppe ore davanti all'esercizio :P

    Cmq, anche con la formula da te proposta, il risultato è esattamente lo stesso!

    Grazie,

    Umberto

  7. #7
    Forse non è la soluzione migliore, ma fa il suo dovere...

    SELECT PITTORE.CodP, COUNT(QUADRO.CodQ) AS NumQ FROM PITTORE, QUADRO WHERE PITTORE.CodP=QUADRO.CodP GROUP BY PITTORE.CodP ORDER BY NumQ DESC LIMIT 1

    purtroppo sto cercando di aiutarti ma non sono neanch'io una espertona di sql.

    Il problema della tua select credo sia che non puoi usare contemporaneamente WHERE e HAVING.

    Il secondo quesito va al di là delle mie possibilità, comunque il consiglio è sempre quello di leggere bene gli errori che ti vengono restituiti e modificare di conseguenza l'sql.

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.