Newsgroup: it.comp.appl.access
Titolo: Query correlate

Ciao a tutti,
domani ho una prova di laboratorio di SQL. In generale mi sembra di
cavarmela abbastanza bene tranne per una cosa: le query correlate.
Probabilmente basterà fare esercizi su esercizi ma nessuno ce ne ha dato il
tempo.
Qualche anima pia potrebbe aiutarmi a capire il ragionamento (che a me pare
mooolto contorto) che sta dietro a questo tipo di query? Ci sono dei
trucchetti d'esperienza?
Grazie mille.
Matto
PS Se sei un'anima veramente pia scrivi anche questa:
Supp. che una persona, durante un viaggio, visiti una e una sola città.
tabella Viaggi: ID, Nome del viaggiatore, Città visitata
 _______        ¯¯
| ID    |
| Nome  |
| Citta |
 ¯¯¯¯¯¯¯
1. Selezionare i nomi delle persone che, nella loro vita, hanno visitato
almeno le stesse città di Tizio.
2. Selezionare i nomi delle persone che, nella loro vita, hanno visitato
esattamente le stesse città di Tizio.

 esattamente le stesse città di Tizio.
Premetto che probabilemnte esiste una soluzione più semplice, ma questa è la
prima che mi è venuta in mente... e poi sono noto per risolvere problemi
semplici in modo contorto :-)
Allora, ci sono 5 query:
nomi_citta -------------------------------------> estrae 1 sola volta i nomi
delle città visitate da Tizio
numero citta visitate da tutti 1 -----------> lista delle persone che hanno
visitato alemno 1 delle città visitate da tizio
numero citta visitate dal viaggiatore ---> numero di città visitate da Tizio
(estrae una sola riga con un numero)
numero citta visitate da tutti 2 -----------> da la risposta al punto 1
numero citta visitate da tutti 2_bis -----> da la risposta al punto 2
Il ragionamento è il seguente:
Estraggo la lista delle città visitate da Tizio,
Le conto per sapere quante sono (mi serve dopo)
Estraggo la lista delle persone che hanno visitato almeno una delle città
visitate da tizio, nome e città visitata (un volta sola per città)
Conto quante città sono state visitate dalle persone estratte
Se questo nuemro è = a quello delle città visitate da tizio, allora queste
persone DEVONO aver visitato le stesse città visitate da tizio (visto che ho
estratto solo quelle)
nomi_citta:
SELECT DISTINCT Viaggi.Citta
FROM Viaggi
WHERE (((Viaggi.Nome)="Tizio"));
numero citta visitate da tutti 1:
SELECT DISTINCT Viaggi.Nome, Viaggi.Citta
FROM Viaggi INNER JOIN nomi_citta ON Viaggi.Citta = nomi_citta.Citta;
numero citta visitate dal viaggiatore:
SELECT DISTINCT Count(nomi_citta.Citta) AS ConteggioDiCitta
FROM nomi_citta;
numero citta visitate da tutti 2:
SELECT [numero citta visitate da tutti 1].Nome, Count([numero citta visitate
da tutti 1].Citta) AS ConteggioDiCitta
FROM [numero citta visitate da tutti 1]
GROUP BY [numero citta visitate da tutti 1].Nome
HAVING ((([numero citta visitate da tutti 1].Nome)<>"Tizio") AND
((Count([numero citta visitate da tutti 1].Citta))=(SELECT DISTINCT
Count(nomi_citta.Citta) AS ConteggioDiCitta FROM nomi_citta)));
numero citta visitate da tutti 2_bis:
SELECT [numero citta visitate da tutti 1].Nome, Count([numero citta visitate
da tutti 1].Citta) AS ConteggioDiCitta
FROM [numero citta visitate da tutti 1]
GROUP BY [numero citta visitate da tutti 1].Nome
HAVING ((([numero citta visitate da tutti 1].Nome)<>"Tizio") AND
((Count([numero citta visitate da tutti 1].Citta))>=(SELECT DISTINCT
Count(nomi_citta.Citta) AS ConteggioDiCitta FROM nomi_citta)));
Certo che vista cosi sembra una cosa complicataaaaa...
Se vuoi ti mando il file mdb.
Ciao, Max