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

Importante :  Il presente articolo è stato tradotto automaticamente, vedere la dichiarazione di non responsabilità. Per visualizzare la versione inglese dell'articolo, fare clic qui.

A volte può essere utile utilizzare i risultati di una query come campo in un'altra query o come criterio per un campo 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 altre date degli ordini per quel prodotto. Poiché anche per confrontare le date degli ordini è necessario utilizzare una query, è possibile nidificarla 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.

In questo 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 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. Si consideri in via esemplificativa l'esempio in cui si desidera visualizzare l'intervallo tra gli ordini di ciascun prodotto, per determinare il quale è necessario confrontare la data di ogni ordine con le altre date degli ordini per quel prodotto. È possibile creare una query che restituisca queste informazioni utilizzando il modello Northwind 2007.

Procedura per impostare Northwind 2007

  1. Fare clic sul pulsante con il logo di Microsoft Office Icona del pulsante Office , quindi su Nuovo.

  2. Nel riquadro sinistro, in Categorie di modelli fare clic su Modelli locali.

  3. In Modelli locali fare clic su Northwind 2007, quindi scegliere Crea.

  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.

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

  2. Nella finestra di dialogo Mostra tabella fare clic su Query, quindi fare doppio clic su Ordini prodotti (Product Orders).

  3. Chiudere la finestra di dialogo Mostra tabella.

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

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

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

  7. Nella terza colonna della griglia fare clic con il pulsante destro del mouse sulla riga Campo, quindi scegliere Zoom dal menu di scelta rapida.

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

    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 è una 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 ai valori nella riga corrente della query principale.

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

Interval: [Order Date]-[Prior Date]

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

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

    La query viene eseguita e viene visualizzato un elenco di nomi di prodotti, date degli ordini, date degli ordini precedenti e l'intervallo tra le date degli ordini. I risultati vengono prima ordinati per ID Prodotto, in ordine crescente, quindi per Data ordine in ordine decrescente.

    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.

Inizio pagina

Utilizzo di una sottoquery come criterio per un campo query

È possibile utilizzare una sottoquery come criterio 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 seguente procedura:

  1. Aprire Northwind 2007.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 (Employees) fare doppio clic sul campo Posizione (Job Title) 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 [Employees] 
    WHERE [Job Title]<>'Sales Representative')

    Questa è la sottoquery con cui vengono selezionati tutti gli ID dipendente in cui il dipendente non ha la posizione di Venditore (Sales Representative) 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.

Inizio pagina

Parole chiave SQL comuni utilizzabili con una sottoquery

Alcune parole chiave SQL possono essere utilizzate con una sottoquery:

Nota : Questo elenco non è esaustivo, inoltre è possibile utilizzare qualsiasi parola chiave SQL valida in una sottoquery, 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 riportata di seguito:

    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 riportata di seguito restituisce un elenco di prodotti presenti in almeno un ordine esistente:

    SELECT *
    FROM [Products]
    WHERE EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);

    Se si utilizza 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]);
  • IN    Utilizzare IN in una clausola WHERE per verificare che un valore nella riga corrente della query principale fa 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 fa parte del set restituito dalla sottoquery.

    Ad esempio, la query riportata di seguito restituisce una elenco di ordini (Orders), con le relative date, elaborati da dipendenti (Employees) la cui posizione (Job Title) non è quella di venditore (Sales Representative):

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]<>'Sales Representative');

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

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] NOT IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]='Sales Representative');

Inizio pagina

Nota : Dichiarazione di non responsabilità per la traduzione automatica: Il presente articolo è stato tradotto tramite un software di traduzione automatica e non da una persona. Microsoft offre le traduzioni automatiche per consentire a coloro che non conoscono la lingua inglese di leggere gli articoli sui prodotti, sui servizi e sulle tecnologie Microsoft. Dal momento che l'articolo è stato tradotto automaticamente, potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli.

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.

×