[Basi di dati] problema

francescobarbic
Buongiorno a tutti, sto preparando un esame di informatica e non riesco proprio a capire come mai la soluzione di questo esercizio sia questa, qualcuno riesce a spiegarmelo?

grazie anticipatamente :-D
Francesco

http://tinypic.com/view.php?pic=2j5cgv7&s=8

Risposte
apatriarca
Ciao, il mio consiglio è quello di provare a separare la query in parte e analizzare ogni parte separatamente.

francescobarbic
Ci ho provato ma la query in parte mi viene:

Ret
4000
4000

con "WHERE C.Ret IN..." dovrebbe considerare i valori tra questi sopra, com'è possibile che ne conti due per ogni C.CF?

apatriarca
Partiamo dalla selezione interna. La query restituisce i due valori 2000 e 4000 in quanto 2000 compare due volte e quindi la sua somma totale è maggiore a 2000, mentre non è sufficiente per Ret=1000. Quindi la query a questo punto diventa equivalente alla seguente:
select C.CF, count(*)
from Aziende A, Consulenti C
where C.Ret = 2000 OR C.Ret = 4000
group by C.CF

Se provi a questo punto a vedere il risultato di
select *
from Aziende A, Consulenti C
where C.Ret = 2000 OR C.Ret = 4000

dovrebbe esserti chiaro perché count diventa uguale a due. In particolare, cosa succede quando hai due tabelle in una select separate da una virgola? Che operazione è?

Come ulteriore indizio:

francescobarbic
Non riesco proprio a capire, il risultato di:

select*
from Aziende A, Consulenti C
where C.Ret = 2000 OR C.Ret = 4000

dovrebbero essere 3 righe (la 2°, la 3° e la 5° di Consulenti) giusto?

apatriarca
No, non sono le tre righe di Consulenti.. Il fatto che ci sia anche la tabella Aziende nella query ha una certa importanza nel risultato. Tu la stai ignorando..

francescobarbic
allora credo di non conoscere dei concetti fondamentali nella comprensione, le sarei grato se me li spiegasse :)

apatriarca
Quando hai un certo numero di tabelle separate da virgola in una select, stai facendo la selezione sul prodotto cartesiano di queste tabelle. Supponi di avere una certa query "select * from R, S" dove R1, .. , Rn sono le righe di R e S1, ... , Sm sono le righe di S. Il risultato sarà l'insieme di tutte le righe formate concatenando le righe Ri e Sj per ogni i e j. Il numero di righe totale sarà quindi m*n. Nel tuo caso devi quindi moltiplicare ogni riga di Consulenti per ogni riga di Aziende.

onlyReferee
Una volta che la query interna è stata eseguita quello che fa quella più esterna non è altro che il prodotto cartesiano. Se non ci fosse la condizione WHERE della query più esterna otterremo un totale di $2 \times 5 = 10$ righe. Da queste però bisogna escludere quelle che hanno il valore Ret pari a $1000$ (per il motivo che ha spiegato apatriarca) che sono $2 \times 2 = 4$ (le due presenti in Consulenti considerate due volte per via del prodotto cartesiano). Prima del raggruppamento otteniamo allora $6$ righe, due per ciascuno dei codici fiscali riportati.
In questo genere di esercizi per comprendere il risultato delle query è necessario cercare di "smontarle" capendo prima qual è il risultato restituito dalle query più interne.

francescobarbic
vi ringrazio entrambi, credo di aver capito ma non capisco come applicarlo a questo esercizio

http://tinypic.com/view.php?pic=1214n4w&s=8

onlyReferee
E' lo stesso identico ragionamento. In questo caso basta prestare attenzione al fatto che nella query più interna hai anche un DISTINCT ma non è nulla di che. Poi nella query più esterna si fa nuovamente il prodotto cartesiano ed il raggruppamento.
Prova a scrivere passo passo il risultato delle query, vedrai che è più semplice di ciò che pensi.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.