Dato il seguente database
- citta (CodCitta, Nome, Popolazione, CodStato)
- citta_attraversate (CodFiume, CodCitta)
- confini (CodStato_1, CodStato_2)
- fiumi (CodFiume, Nome, Lunghezza, CodStatoSorgente, Foce, CodStatoFoce)
- stati_attraversati (CodFiume, CodStato, Km)
- stati (CodStato, Nome, Popolazione, CodCapitale, Superficie)
1.Lo studente crei una query SQL che produca come risultato il nome degli stati attraversati solo da fiumi che
nascono e muoiono nello stesso stato
La soluzione è abbastanza semplice:
SELECT Nome
FROM stati
WHERE CodStato NOT IN (
SELECT CodStato
FROM stati_attraversati, fiumi
WHERE stati_attraversati.CodFiume=fiumi.CodFiume AND
CodStatoSorgente!=CodStatoFoce)
non riesco però a capire perchè se utilizzo il costrutto IN e nella query annidata metto CodStatoSorgente=CodStatoFoce mi dà un risultato diverso
SELECT Nome
FROM stati
WHERE CodStato IN (
SELECT CodStato
FROM stati_attraversati, fiumi
WHERE stati_attraversati.CodFiume=fiumi.CodFiume AND
CodStatoSorgente=CodStatoFoce)
non dovrebbe essere uguale?
2.Lo studente crei una query SQL che produca come risultato il nome del fiume che attraversa il
maggior numero di città appartenenti allo stesso stato.
SELECT DISTINCT fiumi.Nome
FROM fiumi, citta, citta_attraversate
WHERE fiumi.CodFiume=citta_attraversate.CodFiume AND
citta_attraversate.CodCitta=citta.CodCitta
GROUP BY fiumi.CodFiume, CodStato
HAVING COUNT(citta.CodCitta) >= ALL
(SELECT COUNT(citta.CodCitta)
FROM fiumi, citta AS citta, citta_attraversate
WHERE fiumi.CodFiume=citta_attraversate.CodFiume AND
citta_attraversate.CodCitta=citta.CodCitta
GROUP BY fiumi.CodFiume,CodStato)
Come faccio a capire in che modo devo raggruppare le tuple con il costrutto GROUP BY?
Io per esempio le avrei raggruppate solo per fiumi.CodFiume, invece la soluzione le raggruppa anche per CodStato.. come mai?
Grazie!
