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

Si applica a
Access per Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

A volte può essere utile 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 ogni prodotto. Per creare una query che mostri questo intervallo, è necessario confrontare ogni data dell'ordine con altre date dell'ordine per quel prodotto. Anche il confronto di queste date d'ordine richiede una query. È possibile annidare questa query all'interno della query principale usando una 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 nella query principale.

Nota

Una sottoquery usata come alias di campo non può restituire più di un campo.

È possibile usare un alias di campo di sottoquery per visualizzare i valori che dipendono da altri valori nella riga corrente, cosa che non è possibile senza l'uso di una sottoquery.

Torniamo ad esempio all'esempio in cui vuoi vedere l'intervallo tra gli ordini per ciascuno dei tuoi prodotti. Per determinare questo intervallo, è necessario confrontare ogni data dell'ordine con altre date dell'ordine per quel prodotto. È possibile creare una query in cui vengano visualizzate queste informazioni utilizzando il modello di database Northwind.

  1. Nella scheda File fare clic su Nuovo.

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

  3. Fate clic su Northwind, quindi su Crea (Create).

  4. Seguire le istruzioni visualizzate nella pagina Northwind Traders della scheda Schermata iniziale per aprire il database, quindi chiudere la Finestra di dialogo di accesso.

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

  6. Fare clic sulla scheda Query e quindi fare doppio clic su Ordini prodotti.

  7. Fare doppio clic sul campo ID prodotto e sul campo Data ordine per aggiungerli alla griglia di struttura della query.

  8. Nella riga Ordina della colonna ID prodotto della griglia selezionare Crescente.

  9. Nella riga Ordina della colonna Data ordine della griglia selezionare Decrescente.

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

  11. 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. Notare come si usa 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.

  12. Nella quarta colonna della griglia, nella riga Campo , digitare l'espressione seguente:
    Interval: [Order Date]-[Prior Date]
    Questa espressione calcola l'intervallo tra ogni data dell'ordine e la data dell'ordine precedente per quel prodotto, usando il valore per la data precedente definito usando una sottoquery.

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

    1. La query viene eseguita e visualizza un elenco di nomi di prodotti, date dell'ordine, date degli ordini precedenti e l'intervallo tra le date degli ordini. I risultati vengono ordinati prima per ID prodotto (in ordine crescente) e quindi per Data ordine (in ordine decrescente).
    2. Nota

      Poiché l'ID prodotto è un campo di ricerca, per impostazione predefinita Access visualizza i valori di ricerca, in questo caso il nome del prodotto, anziché gli ID prodotto effettivi. Anche se cambia i valori visualizzati, non cambia l'ordinamento.

  14. Chiudere il database Northwind.

Inizio pagina

Usare una sottoquery come criterio per un campo query

È possibile usare una sottoquery come criterio di campo. Usare una sottoquery come criterio di campo per usare i risultati della sottoquery per limitare i valori visualizzati nel campo.

Si supponga, ad esempio, di voler rivedere un elenco di ordini elaborati da dipendenti che non sono rappresentanti di vendita. Per generare l'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, utilizzare una sottoquery, come illustrato nella procedura seguente:

  1. Aprire Northwind.accdb e abilitarne il contenuto.

  2. Chiudere la maschera di accesso.

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

  4. Nella scheda Tabelle fare doppio clic su Ordini e dipendenti.

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

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

  7. 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 dipendente per cui il dipendente non ha una posizione di rappresentante di vendita e fornisce il risultato impostato sulla query principale. La query principale verifica quindi se gli ID dei dipendenti della tabella Ordini sono presenti nel set di risultati.

  8. Nel gruppo Risultati della scheda Struttura fare clic su Esegui.
    La query viene eseguita e i risultati mostrano un elenco di ordini elaborati da dipendenti che non sono rappresentanti di vendita.

Inizio pagina

Parole chiave SQL comuni che è possibile utilizzare con una sottoquery

Esistono diverse parole chiave SQL che è possibile usare con una sottoquery:

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 universitario. Gli studenti devono mantenere un GPA minimo, che varia da maggiore a maggiore. Le major e i relativi GPA minimi vengono archiviati in una tabella denominata Majors e le informazioni relative agli studenti vengono archiviate in una tabella denominata Student_Records.
    Per visualizzare un elenco di major (e i relativi GPA minimi) per i quali ogni studente con tale major supera il GPA minimo, puoi 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]);
    
    
  • 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 universitario. Gli studenti devono mantenere un GPA minimo, che varia da maggiore a maggiore. Le major e i relativi GPA minimi vengono archiviati in una tabella denominata Majors e le informazioni relative agli studenti vengono archiviate in una tabella denominata Student_Records.
    Per visualizzare un elenco di major (e i relativi GPA minimi) per i quali uno studente con tale major non soddisfa il GPA minimo, è possibile utilizzare 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

    Puoi anche usare la parola chiave SOME per lo stesso scopo; la parola chiave SOME è sinonimo di ANY.

  • ESISTE Usare EXISTS in una clausola WHERE per indicare che una sottoquery deve restituire almeno una riga. È anche possibile anteporre a EXISTS NOT, per indicare che una sottoquery non deve restituire alcuna riga.
    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]);
    
    

    Utilizzando NOT EXISTS, la query restituisce un elenco di prodotti non trovati in almeno un ordine esistente:

    SELECT *
    FROM [Products]
    WHERE NOT EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);
    
    
  • IN Usare IN in una clausola WHERE per verificare che un valore nella riga corrente della query principale faccia 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 degli ordini 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');
    
    

Inizio pagina