Nidificare una query all'interno di un'altra query o in un'espressione utilizzando una sottoquery

A volte può essere necessario utilizzare 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 di ciascun prodotto. Per creare una query che mostri questo intervallo, è necessario confrontare la data di ogni ordine con le date degli altri ordini per quel prodotto. Poiché anche per confrontare le date degli ordini è necessario utilizzare una query, è possibile nidificae tale query all'interno della query principale utilizzando una sottoquery.

La sottoquery può essere scritta in un'espressione o in un'istruzione SQL (Structured Query Language) in Visualizzazione SQL.

Contenuto dell'articolo

Utilizzo dei risultati di una query come campo in un'altra query

Utilizzo di una sottoquery come criterio per un campo query

Parole chiave SQL comuni utilizzabili con una sottoquery

Utilizzo dei risultati di una query come campo in un'altra query

È possibile utilizzare una sottoquery come alias (SQL) di campo, ad esempio quando si desidera utilizzare i risultati della sottoquery come un campo nella query principale.

Nota : Una sottoquery utilizzata come alias di campo non può restituire più di un campo.

È possibile utilizzare un alias di campo della sottoquery per visualizzare i valori dipendenti da altri valori nella riga corrente, un'operazione che non sarebbe possibile senza utilizzare una sottoquery.

Nell'esempio citato in precedenza, ovvero quello in cui si desidera visualizzare l'intervallo tra gli ordini di ciascun prodotto, per determinare tale intervallo, è necessario confrontare la data di ogni ordine con le date degli altri ordini per quel prodotto. È possibile creare una query che restituisca queste informazioni utilizzando il modello di database Northwind.

Procedura per impostare Northwind

  1. Nella scheda File fare clic su Nuovo.

  2. In Modelli disponibili fare clic su Modelli di esempio.

  3. Fare clic su Northwind e quindi su Crea.

  4. Per aprire il database, seguire le istruzioni visualizzate nella pagina Northwind Traders della scheda Schermata iniziale. Chiudere la Finestra di dialogo di accesso.

  1. Nel gruppo Query della scheda Crea fare clic su Struttura query.

  2. Nella finestra di dialogo Mostra tabella fare clic sulla scheda Query e quindi fare doppio clic su Ordini prodotti.

  3. Chiudere la finestra di dialogo Mostra tabella.

  4. Fare doppio clic sui campi ID prodotto e Data ordine per aggiungerli alla griglia di struttura della query.

  5. Nella riga Ordinamento della colonna ID prodotto della griglia selezionare Crescente.

  6. Nella riga Ordinamento della colonna Data ordine della griglia selezionare Decrescente.

  7. 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.

  8. Nella finestra di dialogo Zoom digitare o incollare la seguente espressione:

    Data precedente: (SELECT MAX([Data ordine]) 
    FROM [Ordini prodotti] AS [Vecchi ordini]
    WHERE [Vecchi ordini].[Data ordine] < [Ordini prodotti].[Data ordine]
    AND [Vecchi ordini].[ID prodotto] = [Ordini prodotti].[ID prodotto])

Questa espressione è la sottoquery. Per ogni riga viene selezionata la data dell'ordine più recente che risulta meno recente rispetto alla data dell'ordine già associata alla riga. Si noti l'utilizzo della parola chiave AS per creare un alias di tabella che consente di confrontare i valori nella sottoquery con i valori nella riga corrente della query principale.

  1. Nella riga Campo della quarta colonna della griglia digitare la seguente espressione:

    Intervallo: [Data ordine]-[Data precedente]

Questa espressione calcola l'intervallo tra la data di ogni ordine e la data dell'ordine precedente per quel prodotto utilizzando il valore della data precedente definito mediante la sottoquery.

  1. Nel gruppo Risultati della scheda Struttura fare clic su Esegui.

    1. Quando si esegue la query, viene visualizzato un elenco che include i nomi dei prodotti, le date degli ordini, le date degli ordini precedenti e gli intervalli tra le date degli ordini. I risultati sono ordinati prima per ID prodotto, in ordine crescente, quindi per Data ordine in ordine decrescente.

    2. Nota : Poiché ID prodotto è un campo di ricerca, per impostazione predefinita vengono visualizzati i valori di ricerca, in questo caso il nome del prodotto, anziché gli ID prodotto effettivi. Anche se in questo modo vengono modificati i valori visualizzati, non viene modificato l'ordinamento.

  2. Chiudere il database Northwind.

Torna all'inizio

Utilizzo di una sottoquery come criterio per un campo query

È possibile utilizzare una sottoquery come criteri di campo, ad esempio quando si desidera utilizzare 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 venditori. Per generare l'elenco è necessario confrontare l'ID dipendente per ogni ordine con un elenco di ID dipendente relativi ai dipendenti non venditori. Per creare questo elenco e utilizzarlo come criterio di campo, utilizzare una sottoquery come illustrato nella procedura seguente:

  1. Aprire Northwind.accdb e attivarne il contenuto.

  2. Chiudere la maschera di accesso.

  3. Nel gruppo Altro della scheda Crea fare clic su Struttura query.

  4. Nella finestra di dialogo Mostra tabella fare doppio clic su Ordini e su Dipendenti nella scheda Tabelle.

  5. Chiudere la finestra di dialogo Mostra tabella.

  6. Nella tabella Ordini fare doppio clic sui campi ID dipendente, ID ordine e 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.

  7. Fare clic con il pulsante destro del mouse sulla riga Criteri della colona ID dipendente, quindi scegliere Zoom dal menu di scelta rapida.

  8. Nella casella Zoom digitare o incollare la seguente espressione:

    IN (SELECT [ID] FROM [Dipendenti] 
    WHERE [Posizione]<>'Venditore')

    Questa è la sottoquery che consente di selezionare tutti gli ID dipendente dei dipendenti la cui posizione non è Venditore e che fornisce il set dei risultati alla query principale. Tramite la query principale viene quindi verificato se gli ID dipendente della tabella Ordini sono inclusi nel set di risultati.

  9. Nel gruppo Risultati della scheda Struttura fare clic su Esegui.

    La query viene eseguita e nei relativi risultati viene visualizzato un elenco di ordini elaborati da dipendenti non venditori.

Torna all'inizio

Parole chiave SQL comuni utilizzabili con una sottoquery

Esistono varie parole chiave SQL che possono essere utilizzate con una sottoquery.

Nota : Questo elenco non è esaustivo. In una sottoquery è infatti possibile utilizzare qualsiasi parola chiave SQL valida ad eccezione delle parole chiave di definizione dei dati.

  • ALL    Utilizzare ALL in una clausola WHERE per recuperare le righe che soddisfano la condizione quando viene eseguito il confronto con ogni riga restituita dalla sottoquery.

Si supponga, ad esempio, di analizzare i dati degli studenti di un'università. Gli studenti devono mantenere una media annuale (GPA) minima (Min_GPA) che varia da disciplina a disciplina. Le discipline e le relative medie GPA minime sono archiviate in una tabella relativa alle discipline di specializzazione (Majors), mentre le informazioni sugli studenti sono archiviate in una tabella relativa ai record degli studenti (Student_Records).

Per visualizzare un elenco di discipline e delle relative medie GPA minime per cui ogni studente che segue quella disciplina supera la media GPA minima, è possibile utilizzare la query seguente:

SELECT [Major], [Min_GPA] 
FROM [Majors]
WHERE [Min_GPA] < ALL
(SELECT [GPA] FROM [Student_Records]
WHERE [Student_Records].[Major]=[Majors].[Major]);
  • ANY    Utilizzare ANY in una clausola WHERE per recuperare le righe che soddisfano la condizione quando viene eseguito il confronto con almeno una delle righe restituite dalla sottoquery.

    Si supponga, ad esempio, di analizzare i dati degli studenti di un'università. Gli studenti devono mantenere una media annuale (GPA) minima (Min_GPA) che varia da disciplina a disciplina. Le discipline e le relative medie GPA minime sono archiviate in una tabella relativa alle discipline di specializzazione (Majors), mentre le informazioni sugli studenti sono archiviate in una tabella relativa ai record degli studenti (Student_Records).

    Per visualizzare un elenco di discipline e delle relative medie GPA minime per cui qualsiasi studente che segue quella disciplina non soddisfa la media GPA minima, è possibile utilizzare la query riportata di seguito:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] > ANY
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);

    Nota : È inoltre possibile utilizzare la parola chiave SOME per lo stesso scopo, essendo SOME sinonimo di ANY.

  • EXISTS    Utilizzare EXISTS in una clausola WHERE per indicare che una sottoquery dovrà restituire almeno una riga. È inoltre possibile far precedere NOT a EXISTS per indicare che una sottoquery non dovrà restituire alcuna riga.

    Ad esempio, la query seguente restituisce un elenco di prodotti presenti in almeno un ordine esistente:

    SELECT *
    FROM [Prodotti]
    WHERE EXISTS
    (SELECT * FROM [Dettagli sugli ordini]
    WHERE [Dettagli sugli ordini].[ID prodotto]=[Prodotti].[ID]);

    Se si utilizza NOT EXISTS, la query restituisce un elenco di prodotti non presenti in almeno un ordine esistente:

    SELECT *
    FROM [Prodotti]
    WHERE NOT EXISTS
    (SELECT * FROM [Dettagli sugli ordini]
    WHERE [Dettagli sugli ordini].[ID prodotto]=[Prodotti].[ID]);
  • IN    Utilizzare IN in una clausola WHERE per verificare che un valore nella riga corrente della query principale faccia parte del set restituito dalla sottoquery. È inoltre possibile far precedere NOT a IN 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 le relative date, elaborati da dipendenti la cui posizione non è quella di venditore:

    SELECT [ID ordine], [Data ordine]
    FROM [Ordini]
    WHERE [ID dipendente] IN
    (SELECT [ID] FROM [Dipendenti]
    WHERE [Posizione]<>'Venditore');

    Utilizzando NOT IN è possibile scrivere la stessa query come segue:

    SELECT [ID ordine], [Data ordine]
    FROM [Ordini]
    WHERE [ID dipendente] NOT IN
    (SELECT [ID] FROM [Dipendenti]
    WHERE [Posizione]='Venditore');

Torna all'inizio

Amplia le tue competenze
Esplora i corsi di formazione
Ottieni in anticipo le nuove caratteristiche
Partecipa al programma Office Insider

Queste informazioni sono risultate utili?

Grazie per i tuoi commenti e suggerimenti

Grazie per il tuo feedback! Potrebbe essere utile metterti in contatto con uno dei nostri operatori del supporto di Office.

×