PDA

View Full Version : [SQL] Interrogazione, aiutatemi


UmbertoBar
26-11-2008, 03:48
Salve a tutti, sto seguendo un corso di Basi di Dati e, ahimè, non ci capisco granché!
Devo fare questa esercitazione:

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)

Ho provato a farla girare caricando una tabella di prova su un dominio di mia proprietà, ma non funziona!
Mi dice che il campo NumQ non esiste ...

Idee?

Grazie per l'aiuto

UmbertoBar
26-11-2008, 23:20
:-( Non c'è nessuno che può aiutarmi a capire questo errore????

UmbertoBar
27-11-2008, 14:33
Scusate se insisto, ma se veramente non c'è nessuno qua in grado di spiegarmi questa cosa, come faccio io che sto ancora seguendo il corso per imparare queste cose???

RaouL_BennetH
27-11-2008, 16:32
Ciao :)

Non sono un esperto ma ad occhio direi che:

1) NumQ non è settata come variabile temporanea e non basta 'AS' per renderla tale se non per il nome della colonna in visualizzazione.

In base al tipo di db che stai usando dovresti vedere cosa utilizzare per creare una variabile temporanea; generalmente è : set @nomeVariabile := valore.

Ad ogni modo, accertati prima che il risultato sia quello che vorresti semplicemente con:


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(Q.CodQ)



Poi, le 'join' le hai già studiate?

thehuge
27-11-2008, 22:04
Per ogni nazione, visualizzare il codice del pittore che ha dipinto il numero massimo di
quadri e il relativo numero di quadri dipinti.




CREATE VIEW pittori_numquadri AS
SELECT p.Nazione AS Nazione, p.CodP AS CodP, count(*) AS numQ
FROM PITTORE p
INNER JOIN QUADRO q ON q.CodP = p.CodP
GROUP BY p.Nazione, p.CodP;

CREATE VIEW nazioni_maxquadri AS
SELECT p.Nazione AS Nazione, max(numQ) AS maxQ
FROM pittori_numquadri
GROUP BY p.Nazione;


SELECT DISTINCT Nazione, CodP, numQ
FROM pittori_numquadri p
INNER JOIN nazioni_maxquadri n ON p.Nazione = n.Nazione
WHERE p.numQ = n.maxQ;