5° Anno TEORIA 4. Introduzione al linguaggio SQL | Page 54

16 . Il linguaggio SQL Vers . 9.3 – Marzo 2024
Esempio : si consideri , ancora una volta , l ’ esempio discusso a lezione , reperibile all ’ url
http :// www . riochierego . it / mobile / docs / quinta / lab / ESERCITAZIONE-db-esempio-CON-STORICO- FORNITORE-FORNISCE-ARTICOLO-SOLO-TESTO-QUERY-ALUNNO . pdf
in cui risultano presenti le seguenti relazioni : Fornitore ( CodF , Cognome , Nome , DataN ) Articolo ( CodA , Descrizione , Prezzo ) Fornisce ( IdF , CodF1 , CodA1 , DataF , Qta )
con l ’ attributo " CodF1 " della relazione " Fornisce " che risulta essere chiave esterna o foreign key ( o FK ) sull ’ attributo " CodF " della relazione " Fornitore " con l ’ attributo " CodA1 " della relazione " Fornisce " che risulta essere chiave esterna o foreign key ( o FK ) sull ’ attributo " CodA " della relazione " Articolo "
Query : Visualizzare tutti i fornitori che forniscono un qualche articolo
Una prima soluzione consisterebbe nell ’ effettuare un EQUI-JOIN tra le tabelle Fornitore e Fornisce eliminando le eventuali ennuple duplicate in quanto occorre tenere presente che un fornitore può fornire in generale più articoli . Quindi :
SELECT DISTINCT Fornitore .* FROM Fornitore , Fornisce WHERE ( Fornitore . CodF = Fornisce . CodF1 );
Una soluzione alternativa è offerta proprio dall ’ uso dell ’ operatore EXISTS posto all ’ interno della seguente query annidata :
SELECT Fornitore .* FROM Fornitore WHERE EXISTS ( SELECT * FROM Fornisce WHERE Fornitore . CodF = Fornisce . CodF1 );
Output della query + ------ + --------- + -------- + ------------ + | CodF | Cognome | Nome | DataN | + ------ + --------- + -------- + ------------ + | F _ 01 | ROSSI | MARIO | 1965-01-01 | | F _ 02 | GIALLI | ANDREA | 1960-08-08 | | F _ 03 | ROSSI | ELIA | 1963-07-03 | + ------ + --------- + -------- + ------------ +
Anche se l ’ uso di EXISTS è facilmente comprensibile , ciò che può risultare meno intuitivo è il modo in cui la subquery è correlata con la query principale : all ’ interno della clausola WHERE , infatti , abbiamo utilizzato il campo CodF della tabella Fornitore . Ciò implica che la subquery dovrà essere eseguita con un parametro diverso per ogni riga estratta dalla query esterna . Il risvolto pratico è un significato degrado delle prestazioni : in questi casi è sempre meglio preferire soluzioni alternative , considerato come abbiamo visto anche in questo caso , che le subquery correlate possono essere trasformate in operazioni di EQUI-JOIN o simili .
Autore : Rio Chierego ( email : riochierego @ libero . it - sito web : www . riochierego . it ) Pag . 54