[Basi di dati] problema
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
Francesco
http://tinypic.com/view.php?pic=2j5cgv7&s=8
grazie anticipatamente

Francesco
http://tinypic.com/view.php?pic=2j5cgv7&s=8
Risposte
Ciao, il mio consiglio è quello di provare a separare la query in parte e analizzare ogni parte separatamente.
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?
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?
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:
Se provi a questo punto a vedere il risultato di
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:
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:
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?
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?
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..
allora credo di non conoscere dei concetti fondamentali nella comprensione, le sarei grato se me li spiegasse

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.
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.
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.
vi ringrazio entrambi, credo di aver capito ma non capisco come applicarlo a questo esercizio
http://tinypic.com/view.php?pic=1214n4w&s=8
http://tinypic.com/view.php?pic=1214n4w&s=8
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.
Prova a scrivere passo passo il risultato delle query, vedrai che è più semplice di ciò che pensi.