La query che hai postato funziona in questo modo: prima viene creata una "vista" che comprende tutti i record di Programmi giustapposti a quelli di Artisti, e ancora giustapposti a quelli di Artisti (in altre parole, il prodotto cartesiano delle tre tabelle). Questa vista viene poi filtrata per selezione, mantenendo:
- prima solo i record che hanno il codice del Programma nella prima copia di Artisti ("join" tra Programmi e Artisti)
- poi solo i record che hanno il codice del Programma anche nella seconda copia di Artisti ("join" tra Programmi, A1 e A2)
- infine, quelli che hanno il nome della prima copia di Artisti "seguente" a quello della seconda copia di Artisti
Per questo motivo la query funziona, perché se un Programma fosse curato da un solo Artista verrebbe escluso dal terzo dei filtri di cui sopra: la "vista" filtrata al secondo livello avrebbe infatti solo una riga con il riferimento al Programma e il doppio riferimento all'Artista.
A dire il vero, la query non funziona poi così bene: se gli Artisti di un programma fossero tre, il risultato comprenderebbe tre record (primo artista con secondo, primo con terzo, e secondo con terzo). Per questo motivo serve la clausola DISTINCT...
Come soluzione, è decisamente più intuitiva questa (a te scoprire come funziona...):
Codice:
SELECT NomeProgramma
FROM Programmi
WHERE Codice IN (
SELECT CProgramma
FROM Artisti
GROUP BY CProgramma
HAVING COUNT(numArtisti) >= 2
)
Se non ti è chiara la spiegazione, prova a seguirla utilizzando i dati concreti del tuo database... dovrebbe succedere più o meno quanto ti ho descritto sopra.
Stammi bene...