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

Nota: Riteniamo importante fornire il contenuto della Guida più recente non appena possibile, nella lingua dell'utente. Questa pagina è stata tradotta automaticamente e potrebbe contenere errori di grammatica o imprecisioni. L'intento è quello di rendere fruibile il contenuto. Nella parte inferiore della pagina è possibile indicare se le informazioni sono risultate utili. Questo è l'articolo in lingua inglese per riferimento.

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 annidare 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 di campo. Utilizzare una sottoquery come alias di campo 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 non è possibile senza utilizzare una sottoquery. Ad esempio, possiamo restituire all'esempio in cui si desidera visualizzare l'intervallo tra gli ordini per ognuno dei prodotti. Per determinare l'intervallo, è necessario confrontare ogni data ordine per altri date degli ordini corrispondente a tale prodotto. È possibile creare una query che visualizza queste informazioni utilizzando il modello di Northwind 2007.

Mostra come impostare Northwind 2007

  1. Fare clic sul pulsante 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 e quindi fare clic su 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 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:

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

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

    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.

    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 campo. Utilizzare una sottoquery come criterio campo quando si desidera utilizzare i risultati della sottoquery per limitare i valori che visualizza il 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 2007.accdb Northwind 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 [Employees] 
    WHERE [Job Title]<>'Sales Representative')

    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.

Inizio pagina

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

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

Queste informazioni sono risultate utili?

Grazie per il feedback!

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

×