A volte può essere necessario usare i risultati di una query come campo in un'altra query o come criterio per un campo di query. Si supponga, ad esempio, di voler visualizzare l'intervallo tra gli ordini per ognuno dei prodotti. Per creare una query che mostri questo intervallo, è necessario confrontare ogni data dell'ordine con altre date dell'ordine per il prodotto. Il confronto di queste date dell'ordine richiede anche una query. È possibile annidare questa query all'interno della query principale usando un sottoquery.
È possibile scrivere una sottoquery in un espressione o in un'istruzione Structured Query Language (SQL) in Visualizzazione SQL.
Contenuto dell'articolo
Usare i risultati di una query come campo in un'altra query
È possibile usare una sottoquery come alias di campo. Usare una sottoquery come alias di campo quando si vogliono usare i risultati della sottoquery come campo della query principale.
Nota: Una sottoquery usata come alias di campo non può restituire più di un campo.
È possibile usare un alias di campo sottoquery per visualizzare i valori che dipendono da altri valori nella riga corrente, operazione non possibile senza usare una sottoquery.
Ad esempio, torna all'esempio in cui vuoi visualizzare l'intervallo tra gli ordini per ognuno dei tuoi prodotti. Per determinare questo intervallo, è necessario confrontare ogni data dell'ordine con altre date dell'ordine per il prodotto. È possibile creare una query che mostra queste informazioni usando il modello di database Northwind.
-
Nella scheda File fare clic su Nuovo.
-
In Modelli disponibili fare clic su Modelli di esempio.
-
Fare clic su Northwind e quindi su Create.
-
Seguire le istruzioni visualizzate nella pagina Northwind Traders della scheda Schermata iniziale per aprire il database, quindi chiudere la Finestra di dialogo di accesso.
-
Nel gruppo Query della scheda Crea fare clic su Struttura query.
-
Fare clic sulla scheda Query e quindi fare doppio clic su Ordini prodotti.
-
Fare doppio clic sul campo ID prodotto e sul campo Data ordine per aggiungerli alla griglia di struttura della query.
-
Nella riga Ordina della colonna ID prodotto della griglia selezionare Crescente.
-
Nella riga Ordina della colonna Data ordine della griglia selezionare Decrescente.
-
Nella terza colonna della griglia fare clic con il pulsante destro del mouse sulla riga Campo e quindi scegliere Zoom dal menu di scelta rapida.
-
Nella finestra di dialogo Zoom digitare o incollare l'espressione seguente:
Prior Date: (SELECT MAX([Order Date])
FROM [Product Orders] AS [Old Orders] WHERE [Old Orders].[Order Date] < [Product Orders].[Order Date] AND [Old Orders].[Product ID] = [Product Orders].[Product ID])Questa espressione è la sottoquery. Per ogni riga, la sottoquery seleziona la data dell'ordine più recente, meno recente della data dell'ordine già associata alla riga. Si noti come usare la parola chiave AS per creare un alias di tabella, in modo da poter confrontare i valori nella sottoquery con i valori nella riga corrente della query principale.
-
Nella quarta colonna della griglia digitare l'espressione seguente nella riga Campo :
Interval: [Order Date]-[Prior Date]
Questa espressione calcola l'intervallo tra ogni data dell'ordine e la data dell'ordine precedente per il prodotto, usando il valore per la data precedente definito tramite una sottoquery.
-
Nel gruppo Risultati della scheda Struttura fare clic su Esegui.
-
La query viene eseguita e visualizza un elenco di nomi di prodotti, date degli ordini, date degli ordini precedenti e intervallo tra le date degli ordini. I risultati vengono ordinati prima per ID prodotto (in ordine crescente) e poi per Data ordine (in ordine decrescente).
-
Nota: Poiché ID prodotto è un campo di ricerca, per impostazione predefinita Access visualizza i valori di ricerca, in questo caso il nome del prodotto, invece degli ID prodotto effettivi. Anche se questo cambia i valori visualizzati, non cambia l'ordinamento.
-
-
Chiudere il database Northwind.
Usare una sottoquery come criterio per un campo di query
È possibile usare una sottoquery come criterio di campo. Usare una sottoquery come criterio di campo quando si vogliono usare i risultati della sottoquery per limitare i valori visualizzati nel campo.
Si supponga, ad esempio, di voler esaminare un elenco di ordini elaborati da dipendenti che non sono rappresentanti di vendita. Per generare questo elenco, è necessario confrontare l'ID dipendente per ogni ordine con un elenco degli ID dipendente per i dipendenti che non sono rappresentanti di vendita. Per creare questo elenco e usarlo come criterio di campo, usare una sottoquery, come illustrato nella procedura seguente:
-
Aprire Northwind.accdb e abilitarne il contenuto.
-
Chiudere la maschera di accesso.
-
Nel gruppo Altro della scheda Crea fare clic su Struttura query.
-
Nella scheda Tabelle fare doppio clic su Ordini e dipendenti.
-
Nella tabella Ordini fare doppio clic sul campo ID dipendente , sul campo ID ordine e sul campo Data ordine per aggiungerli alla griglia di struttura della query. Nella tabella Dipendenti fare doppio clic sul campo Posizione per aggiungerlo alla griglia di struttura.
-
Fare clic con il pulsante destro del mouse sulla riga Criteri della colonna ID dipendente e quindi scegliere Zoom dal menu di scelta rapida.
-
Nella casella Zoom digitare o incollare l'espressione seguente:
IN (SELECT [ID] FROM [Employees]
WHERE [Job Title]<>'Sales Representative')Questa è la sottoquery. Seleziona tutti gli ID dei dipendenti in cui il dipendente non ha una posizione di venditore e fornisce il risultato impostato alla query principale. La query principale verifica quindi se gli ID dipendente della tabella Ordini sono inclusi nel set di risultati.
-
Nel gruppo Risultati della scheda Struttura fare clic su Esegui.
La query viene eseguita e i risultati della query mostrano un elenco di ordini elaborati da dipendenti che non sono rappresentanti di vendita.
Parole chiave SQL comuni che è possibile usare con una sottoquery
Con una sottoquery è possibile usare diverse parole chiave SQL:
Nota: L'elenco non è esaustivo. È possibile usare qualsiasi parola chiave SQL valida in una sottoquery, escluse le parole chiave di definizione dei dati.
-
TUTTI Usare ALL in una clausola WHERE per recuperare le righe che soddisfano la condizione rispetto a ogni riga restituita dalla sottoquery.
Si supponga ad esempio di analizzare i dati degli studenti in un istituto di istruzione. Gli studenti devono mantenere un GPA minimo, che varia da specializzazione a specializzazione. Le discipline di specializzazione e i rispettivi gpa minimi vengono archiviati in una tabella denominata Discipline di specializzazione e le informazioni relative agli studenti vengono archiviate in una tabella denominata Student_Records.
Per visualizzare un elenco di discipline di specializzazione (e le rispettive gpa minime) per le quali ogni studente con quella specializzazione supera il valore minimo di GPA, è possibile usare la query seguente:
SELECT [Major], [Min_GPA]
FROM [Majors] WHERE [Min_GPA] < ALL (SELECT [GPA] FROM [Student_Records] WHERE [Student_Records].[Major]=[Majors].[Major]); -
QUALSIASI Usare ANY in una clausola WHERE per recuperare le righe che soddisfano la condizione rispetto ad almeno una delle righe restituite dalla sottoquery.
Si supponga ad esempio di analizzare i dati degli studenti in un istituto di istruzione. Gli studenti devono mantenere un GPA minimo, che varia da specializzazione a specializzazione. Le discipline di specializzazione e i rispettivi gpa minimi vengono archiviati in una tabella denominata Discipline di specializzazione e le informazioni relative agli studenti vengono archiviate in una tabella denominata Student_Records.
Per visualizzare un elenco di discipline di specializzazione (e le rispettive gpa minime) per le quali qualsiasi studente con tale specializzazione non soddisfa il gpa minimo, è possibile usare la query seguente:
SELECT [Major], [Min_GPA]
FROM [Majors] WHERE [Min_GPA] > ANY (SELECT [GPA] FROM [Student_Records] WHERE [Student_Records].[Major]=[Majors].[Major]);Nota: È anche possibile usare la parola chiave SOME per lo stesso scopo; la parola chiave SOME è sinonimo di ANY.
-
EXISTS Usare EXISTS in una clausola WHERE per indicare che una sottoquery deve restituire almeno una riga. È anche possibile anteporre EXISTS a NOT, per indicare che una sottoquery non deve restituire righe.
Ad esempio, la query seguente restituisce un elenco di prodotti trovati in almeno un ordine esistente:
SELECT *
FROM [Products] WHERE EXISTS (SELECT * FROM [Order Details] WHERE [Order Details].[Product ID]=[Products].[ID]);Usando NOT EXISTS, la query restituisce un elenco di prodotti non presenti in almeno un ordine esistente:
SELECT *
FROM [Products] WHERE NOT EXISTS (SELECT * FROM [Order Details] WHERE [Order Details].[Product ID]=[Products].[ID]); -
POLLICI Usare IN in una clausola WHERE per verificare che un valore nella riga corrente della query principale fa parte del set restituito dalla sottoquery. È anche possibile anteporre IN a NOT per verificare che un valore nella riga corrente della query principale non faccia parte del set restituito dalla sottoquery.
Ad esempio, la query seguente restituisce un elenco di ordini (con date di ordine) elaborati da dipendenti che non sono rappresentanti di vendita:
SELECT [Order ID], [Order Date]
FROM [Orders] WHERE [Employee ID] IN (SELECT [ID] FROM [Employees] WHERE [Job Title]<>'Sales Representative');Usando NOT IN, è possibile scrivere la stessa query in questo modo:
SELECT [Order ID], [Order Date]
FROM [Orders] WHERE [Employee ID] NOT IN (SELECT [ID] FROM [Employees] WHERE [Job Title]='Sales Representative');