Usare una query di unione per combinare più query in un singolo risultato

Usare una query di unione per combinare più query in un singolo risultato

In alcuni casi è consigliabile elencare i record da una tabella o query insieme a quelli di una o più tabelle per creare un set di record, ovvero un elenco con tutti i record di due o più tabelle. Questo è lo scopo di una query di unione in Access.

Per comprendere appieno le query di unione, è innanzitutto necessario conoscere la progettazione di query di selezione di base in Access. Per altre informazioni sulla progettazione di query di selezione, vedere Creare una query di selezione semplice.

Nota: Le informazioni di questo articolo sono valide solo con database desktop di Access. Non è possibile creare o usare query di unione nei database o nelle app Web di Access.

Esaminare un esempio di query di unione funzionante

Se non è mai stata creata una query di unione prima, può risultare utile approfondire prima un esempio funzionante nel modello Northwind di Access. È possibile cercare il modello di esempio Northwind nella pagina introduttiva di Access facendo clic su File > Nuovo oppure scaricare una copia direttamente da questa posizione: Modello di esempio Northwind.

Dopo che Access apre il database Northwind, chiudere la maschera della finestra di dialogo di accesso visualizzata ed espandere il riquadro di spostamento. Fare clic sulla parte superiore del riquadro di spostamento e quindi selezionare Tipo di oggetto per organizzare tutti gli oggetti del database in base al tipo. Espandere quindi il gruppo Query per visualizzare una query denominata Transazioni prodotto.

Le query di unione sono facili da distinguere dagli altri oggetti di query perché hanno una speciale icona che somiglia a due cerchi interconnessi che rappresenta l'unione di due set in un set unico:

Screenshot dell'icona di una query di unione in Access.

A differenza delle normali query di selezione e comando, le tabelle non sono correlate in una query di unione, quindi lo strumento di progettazione per query grafiche di Access non può essere usato per creare o modificare le query di unione. Questo si riscontra se si apre una query di unione dal riquadro di spostamento: Access la apre e mostra i risultati nella visualizzazione Foglio dati. Nel comando Visualizzazioni della scheda HomeVisualizzazione Struttura non è disponibile quando si lavora con le query di unione. Si può passare da Visualizzazione Foglio dati a Visualizzazione SQL e viceversa solo quando si usano le query di unione.

Per continuare lo studio di questo esempio di query di unione, fare clic su Home > Visualizzazioni > Visualizzazione SQL per visualizzare la sintassi SQL che lo definisce. Nella figura abbiamo aggiunto altro spazio in SQL per vedere più facilmente le varie parti che compongono una query di unione.

Il browser in uso non supporta le funzionalità video. Installare Microsoft Silverlight, Adobe Flash Player o Internet Explorer 9.

Esaminiamo ora in dettaglio la sintassi SQL di questa query di unione nel database Northwind:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

La prima e la terza parte dell'istruzione SQL sono essenzialmente due query di selezione. Queste query recuperano due diversi set di record, uno dalla tabella Ordini prodotti e l'altro dalla tabella Acquisti prodotti.

La seconda parte dell'istruzione SQL è la parola chiave UNION che indica ad Access che questa query combina questi due set di record.

L'ultima parte dell'istruzione SQL determina l'ordinamento dei record combinati usando un'istruzione ORDER BY. In questo esempio, Access ordina tutti i record per il campo Data ordine in ordine decrescente.

Nota: Le query di unione sono sempre di sola lettura in Access. Non si può modificare alcun valore nella visualizzazione Foglio dati.

Creare una query di unione creando e combinando le query di selezione

Anche se è possibile creare una query di unione scrivendo direttamente la sintassi SQL nella visualizzazione SQL, è più semplice crearla in varie parti con una query di selezione. È possibile quindi copiare e incollare le parti SQL in una query di unione combinata.

Se si preferisce guardare un esempio invece di leggere la procedura, vedere la sezione successiva Guardare un esempio di creazione di una query di unione.

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

  2. Nella finestra di dialogo Mostra tabella fare doppio clic sulla tabella contenete i campi che si desidera includere. La tabella viene aggiunta alla finestra di struttura della query.

  3. Chiudere la finestra di dialogo Mostra tabella.

  4. Nella finestra di struttura della query fare doppio clic su ognuno dei campi che si desidera includere. Mentre si selezionano i campi, assicurarsi di aggiungere lo stesso numero di campi, nello stesso ordine, di quelli aggiunti alle altre query di selezione. Prestare attenzione ai tipi di dati dei campi e verificare che siano compatibili con i tipi di dati dei campi nella stessa posizione delle altre query da combinare. Ad esempio, se per la prima query di selezione si utilizzano cinque campi, il primo dei quali contiene dati di tipo data/ora, assicurarsi che tutte le altre query di selezione da combinare contengano cinque campi e che i dati nel primo di essi siano di tipo data/ora e così via.

  5. È possibile aggiungere facoltativamente criteri ai campi digitando le espressioni appropriate nella riga Criteri della griglia dei campi.

  6. Dopo avere aggiunto i campi e i criteri dei campi, eseguire la query di selezione ed esaminarne l'output. Nel gruppo Risultati della scheda Struttura fare clic su Esegui.

  7. Passare alla visualizzazione Struttura della query.

  8. Salvare la query di selezione e lasciarla aperta.

  9. Ripetere questa procedura per ognuna delle query di selezione che si desidera combinare.

Ora che sono state create le query di selezione, è necessario combinarle. In questo passaggio viene creata la query di unione copiando e incollando le istruzioni SQL.

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

  2. Chiudere la finestra di dialogo Mostra tabella.

  3. Nella scheda Struttura nel gruppo Query fare clic su Unione. Access nasconde la finestra di struttura della query e visualizza la scheda dell'oggetto Visualizzazione SQL che, a questo punto, è vuota.

  4. Fare clic sulla scheda della prima query di selezione che si desidera combinare nella query di unione.

  5. Nella scheda Home fare clic su Visualizza > Visualizzazione SQL.

  6. Copiare l'istruzione SQL per la query di selezione. Fare clic sulla scheda della query di unione che si è iniziato a creare in precedenza.

  7. Incollare l'istruzione SQL della query di selezione nella scheda a oggetti Visualizzazione SQL della query di unione.

  8. Eliminare il punto e virgola (;) alla fine dell'istruzione SQL della query di selezione.

  9. Premere INVIO per spostare il cursore di una riga in basso e quindi digitare UNION nella nuova riga.

  10. Fare clic sulla scheda della successiva query di selezione che si desidera combinare nella query di unione.

  11. Ripetere i passaggi da 5 a 10 finché non saranno state copiate e incollate tutte le istruzioni SQL delle query di selezione nella finestra Visualizzazione SQL della query di unione. Non eliminare il punto e virgola né digitare altri dati dopo l'istruzione SQL dell'ultima query di selezione.

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

I risultati della query di unione verranno visualizzati nella visualizzazione Foglio dati.

Guardare un esempio di creazione di una query di unione

Ecco un esempio che è possibile ricreare nel database di esempio Northwind. Questa query di unione raccoglie i nomi delle persone dalla tabella Clienti e li combina con i nomi delle persone della tabella Fornitori. Per proseguire, usare la procedura nella copia del database di esempio Northwind.

Il browser in uso non supporta le funzionalità video. Installare Microsoft Silverlight, Adobe Flash Player o Internet Explorer 9.

Ecco i passaggi necessari per compilare questo esempio:

  1. Creare due query di selezione, denominate Query1 e Query2 usando come origini dati, rispettivamente, le tabelle Clienti e Fornitori. Usare i campi Nome e Cognome come valori visualizzati.

  2. Creare una nuova query denominata Query3, inizialmente senza alcuna origine dati e quindi scegliere il comando Unione nella scheda Struttura per trasformare questa query in una query di unione.

  3. Copiare e incollare le istruzioni SQL da Query1 e Query2 a Query3. Assicurarsi di rimuovere il punto e virgola aggiuntivo e di aggiungere la parola chiave UNION. È quindi possibile verificare i risultati nella visualizzazione Foglio dati.

  4. Aggiungere una clausola di ordinamento a una delle query e quindi incollare l'istruzione ORDER BY nella visualizzazione SQL della query di unione. In Query3, la query di unione, quando l'ordinamento sta per essere aggiunto, vengono rimossi prima i punti e virgola e poi il nome della tabella dai nomi dei campi.

  5. La sintassi SQL finale che combina e ordina i nomi per questo esempio di query di unione è la seguente:

    SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
    FROM Customers
    
    UNION
    
    SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
    FROM Suppliers
    
    ORDER BY [Last Name], [First Name];

Se si conosce molto bene la sintassi SQL, è possibile scrivere un'istruzione SQL per la query di unione direttamente nella visualizzazione SQL. Tuttavia, può risultare utile seguire l'approccio di copiare e incollare la sintassi SQL da altri oggetti di query. Ogni query può essere molto più complessa dei semplici esempio di query di selezione riportati qui. È opportuno creare e testare ogni query con attenzione prima di combinarle nella query di unione. Se la query di unione non viene eseguita, è possibile modificare singolarmente le query finché non viene eseguita, quindi ricreare la query di unione con la sintassi corretta.

Esaminare le sezioni rimanenti di questo articolo per altri suggerimenti e consigli sull'uso delle query di unione.

Nell'esempio della sezione precedente con il database Northwind vengono combinati solo i dati di due tabelle. Tuttavia, è possibile combinare tre o più tabelle in modo molto semplice in una query di unione. Ad esempio, sulla base dell'esempio precedente, è consigliabile includere anche i nomi dei dipendenti nell'output della query. È possibile eseguire l'attività aggiungendo una terza query e combinando l'istruzione SQL precedente con una parola chiave UNION supplementare come questa:

SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
FROM Customers

UNION

SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers

UNION

SELECT Employees.Company, Employees.[Last Name], Employees.[First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

Quando si visualizzano i risultati nella visualizzazione Foglio dati, verranno elencati tutti i dipendenti con il nome della società di esempio, che probabilmente non è molto utile. Se si vuole che il campo indichi se una persona è un dipendente interno, un fornitore o un cliente, è possibile includere un valore fisso al posto del nome della società. Ecco come verrà visualizzata l'istruzione SQL:

SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers

UNION

SELECT "Supplier" As Employment, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers

UNION

SELECT "In-house" As Employment, Employees.[Last Name], Employees.[First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

Ecco come verrà visualizzato il risultato nella visualizzazione Foglio dati. Access mostra questi cinque record di esempio:

Lavoro

Cognome

Nome

Interno

Leonetti

Adriana

Interno

Bruno

Filippa

Fornitore

Iadanza

Gerolamo

Cliente

Romani

Raffaele

Cliente

Esposito

Quarantino

È possibile ridurre ulteriormente la query precedente perché Access legge solo i nomi dei campi di output della prima query in una query di unione. Qui si vede che abbiamo rimosso l'output dalla seconda e dalla terza sezione della query:

SELECT "Customer" As Employment, [Last Name], [First Name]
FROM Customers

UNION

SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers

UNION

SELECT "In-house", [Last Name], [First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

In una query di unione di Access, l'ordinamento è consentito una sola volta, ma ogni query può essere filtrata singolarmente. Sulla base della query di unione della sezione precedente, ecco un esempio in cui ogni query è stata filtrata aggiungendo una clausola WHERE.

SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
WHERE [State/Province] = "UT"

UNION

SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
WHERE [Job Title] = "Sales Manager"

UNION

SELECT "In-house", Employees.[Last Name], Employees.[First Name]
FROM Employees
WHERE City = "Seattle"

ORDER BY [Last Name], [First Name];

Passare alla visualizzazione Foglio dati per visualizzare risultati simili al seguente:

Lavoro

Cognome

Nome

Fornitore

Milani

Martina

Interno

Leonetti

Adriana

Cliente

Romani

Benito

Interno

Hellung-Larsen

Anne

Fornitore

Baresi

Rebecca

Cliente

Sabbatini

Benigno

Fornitore

Longo

Gerardino

Fornitore

Lombardi

Pietro

Interno

Barese

Carmelo

Fornitore

Siciliano

Fabiola

Interno

Capon

Cataldo

Se le query da unire sono molto diverse, possono verificarsi situazioni in cui un campo di output deve combinare dati di tipi diversi. In questo caso, la query di unione spesso restituirà i risultati come tipo di dati di testo perché questo tipo di dati può contenere sia testo che numeri.

Per comprendere il funzionamento, verrà usata la query di unione Transazioni prodotto nel database di esempio Northwind. Aprire il database di esempio e quindi aprire la query Transazioni prodotto nella visualizzazione Foglio dati. Gli ultimi dieci record dovrebbero essere simili a questo output:

ID prodotto

Data ordine

Nome società

Transazione

Quantità

77

22/01/2006

Fornitore B

Acquisto

60

80

22/01/2006

Fornitore D

Acquisto

75

81

22/01/2006

Fornitore A

Acquisto

125

81

22/01/2006

Fornitore A

Acquisto

200

7

20/01/2006

Società D

Vendita

10

51

20/01/2006

Società D

Vendita

10

80

20/01/2006

Società D

Vendita

10

34

15/01/2006

Società AA

Vendita

100

80

15/01/2006

Società AA

Vendita

30

Supponiamo di voler dividere il campo Quantità in due: Acquisto e Vendita. Supponiamo anche di volere un valore zero fisso per il campo senza valori. Ecco come apparirà la sintassi SQL per la query di unione:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC; 

Se si passa alla visualizzazione Foglio dati, verranno visualizzati gli ultime dieci record che ora sono visualizzati come segue:

ID prodotto

Data ordine

Nome società

Transazione

Acquisto

Vendita

74

22/01/2006

Fornitore B

Acquisto

20

0

77

22/01/2006

Fornitore B

Acquisto

60

0

80

22/01/2006

Fornitore D

Acquisto

75

0

81

22/01/2006

Fornitore A

Acquisto

125

0

81

22/01/2006

Fornitore A

Acquisto

200

0

7

20/01/2006

Società D

Vendita

0

10

51

20/01/2006

Società D

Vendita

0

10

80

20/01/2006

Società D

Vendita

0

10

34

15/01/2006

Società AA

Vendita

0

100

80

15/01/2006

Società AA

Vendita

0

30

Proseguendo con l'esempio, come si impostano i campi con zero in modo che risultino vuoti? È possibile modificare la sintassi SQL in modo che non visualizzi nessun valore al posto dello zero, aggiungendo la parola chiave Null come mostrato di seguito:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Tuttavia, come si può osservare passando alla visualizzazione Foglio dati, viene restituito un risultato imprevisto. Nella colonna Acquisto sono deselezionati tutti i campi:

ID prodotto

Data ordine

Nome società

Transazione

Acquisto

Vendita

74

22/01/2006

Fornitore B

Acquisto

 

 

77

22/01/2006

Fornitore B

Acquisto

 

 

80

22/01/2006

Fornitore D

Acquisto

 

 

81

22/01/2006

Fornitore A

Acquisto

 

 

81

22/01/2006

Fornitore A

Acquisto

 

 

7

20/01/2006

Società D

Vendita

 

10

51

20/01/2006

Società D

Vendita

 

10

80

20/01/2006

Società D

Vendita

 

10

34

15/01/2006

Società AA

Vendita

 

100

80

15/01/2006

Società AA

Vendita

 

30

Il motivo per cui accade è che Access determina i tipi di dati dei campi dalla prima query. In questo esempio Null non è un numero.

Quindi, che cosa succede se si cerca di inserire una stringa vuota per il valore vuoto dei campi? L'istruzione SQL per questo tentativo potrebbe somigliare alla seguente:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Quando si passa alla visualizzazione Foglio dati, Access recupera i valori di acquisto, ma convertiti in valori di testo. È possibile stabilire che sono valori di testo perché sono allineati a sinistra nella visualizzazione Foglio dati. Una stringa vuota nella prima query non è un numero, ecco perché vengono visualizzati questi risultati. Si noterà che anche i valori Vendita vengono convertiti in testo perché i record di acquisto contengono una stringa vuota.

ID prodotto

Data ordine

Nome società

Transazione

Acquisto

Vendita

74

22/01/2006

Fornitore B

Acquisto

20

 

77

22/01/2006

Fornitore B

Acquisto

60

 

80

22/01/2006

Fornitore D

Acquisto

75

 

81

22/01/2006

Fornitore A

Acquisto

125

 

81

22/01/2006

Fornitore A

Acquisto

200

 

7

20/01/2006

Società D

Vendita

 

10

51

20/01/2006

Società D

Vendita

 

10

80

20/01/2006

Società D

Vendita

 

10

34

15/01/2006

Società AA

Vendita

 

100

80

15/01/2006

Società AA

Vendita

 

30

Quindi, come si risolve il problema?

Una soluzione consiste nel forzare la query in modo che preveda un numero come valore del campo. Per farlo, usare l'espressione:

IIf(False, 0, Null)

La condizione da verificare, False, non sarà mai True, quindi l'espressione restituirà sempre Null. Access valuta comunque entrambe le opzioni di output e specifica se l'output debba essere numerico o Null.

Ecco come usare l'espressione in questo esempio:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Non è necessario modificare la seconda query.

Se si passa alla visualizzazione Foglio dati, comparirà un risultato desiderato:

ID prodotto

Data ordine

Nome società

Transazione

Acquisto

Vendita

74

22/01/2006

Fornitore B

Acquisto

20

 

77

22/01/2006

Fornitore B

Acquisto

60

 

80

22/01/2006

Fornitore D

Acquisto

75

 

81

22/01/2006

Fornitore A

Acquisto

125

 

81

22/01/2006

Fornitore A

Acquisto

200

 

7

20/01/2006

Società D

Vendita

 

10

51

20/01/2006

Società D

Vendita

 

10

80

20/01/2006

Società D

Vendita

 

10

34

15/01/2006

Società AA

Vendita

 

100

80

15/01/2006

Società AA

Vendita

 

30

Un metodo alternativo per ottenere lo stesso risultato consiste nell'anteporre un'ulteriore query alle query nella query di unione:

SELECT 
    0 As [Product ID], Date() As [Order Date], 
    "" As [Company Name], "" As [Transaction], 
    0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False

Per ogni campo, Access restituisce i valori fissi del tipo di dati definito. Ovviamente, non si vuole che l'output di questa query interferisca con i risultati. Per evitarlo, includere una clausola WHERE impostata su False:

WHERE False

Si tratta di un trucco perché la clausola è sempre falsa, quindi la query non restituisce alcun valore. La combinazione di questa istruzione con l'istruzione SQL esistente produce un'istruzione completa:

SELECT 
    0 As [Product ID], Date() As [Order Date], 
    "" As [Company Name], "" As [Transaction], 
    0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False

UNION

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Nota: La query combinata di questo esempio basata sul database Northwind restituisce 100 record, mentre due singole query restituiscono 58 e 43 record per un totale di 101 record. Il motivo di questa discrepanza è che due record non sono univoci. Vedere la sezione Usare record distinti nelle query di unione con UNION ALL per informazioni su come risolvere lo scenario con UNION ALL.

Un tipo particolare di query di unione prevede la combinazione di un set di record con un record che contiene la somma di uno o più campi.

Ecco un altro esempio che si può creare nel database di esempio Northwind per illustrare come ottenere un totale in una query di unione.

  1. Creare una nuova query semplice per visualizzare l'acquisto di birre (ID prodotto = 34 nel database Northwind) usando la sintassi SQL seguente:

    SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    ORDER BY [Purchase Order Details].[Date Received];
  2. Passare alla visualizzazione Foglio dati in cui dovrebbero essere mostrati quattro acquisti:

    Data di ricezione

    Quantità

    22/01/2006

    100

    22/01/2006

    60

    04/04/2006

    50

    05/04/2006

    300

  3. Per ottenere il totale, creare una query di aggregazione semplice con l'istruzione SQL seguente:

    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
  4. Passare alla visualizzazione Foglio dati in cui dovrebbe essere mostrato un solo record:

    MaxOfDate Received

    SumOfQuantity

    05/04/2006

    510

  5. Combinare queste due query in una query di unione per aggiungere il record con la quantità totale di record di acquisto:

    SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    UNION
    
    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    ORDER BY [Purchase Order Details].[Date Received];
  6. Passare alla visualizzazione Foglio dati in cui dovrebbero essere mostrati quattro acquisti e la somma di ciascuno, seguita da un record che contiene il totale della quantità:

    Data di ricezione

    Quantità

    22/01/2006

    60

    22/01/2006

    100

    04/04/2006

    50

    05/04/2006

    300

    05/04/2006

    510

Questo illustra le nozioni di base sull'aggiunta dei totali a una query di unione. È anche possibile includere valori fissi in entrambe le query, ad esempio "Dettaglio" e "Totale" per separare visivamente il record totale da altri record. Per rivedere, usare i valori fissi nella sezione Combinare tre o più tabelle o query in una query di unione.

Per impostazione predefinita, le query di unione in Access includono solo record distinti. Ma cosa succede se si vogliono includere tutti i record? Può essere utile esaminare un altro esempio.

Nella sezione precedente è stato illustrato come creare un totale in una query di unione. Modificare l'istruzione SQL della query di unione per includere l'ID prodotto = 48:

SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

UNION

SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

ORDER BY [Purchase Order Details].[Date Received];

Passare alla visualizzazione Foglio dati in cui dovrebbe essere mostrato un risultato fuorviante.

Data di ricezione

Quantità

22/01/2006

100

22/01/2006

200

Ovviamente, un solo record non restituisce il doppio della quantità nel totale.

Il motivo per cui viene visualizzato questo risultato è che in un determinato giorno è stata venduta due volte la stessa quantità di cioccolatini, come registrato nella tabella Dettagli ordine di acquisto. Ecco un risultato della query di selezione semplice che mostra entrambi i record nel database di esempio Northwind:

ID Ordine di acquisto

Product

Quantity

100

Northwind Traders Chocolate

100

92

Northwind Traders Chocolate

100

Nella query di unione indicata in precedenza si può vedere che il campo ID Ordine di acquisto non è incluso e che i due campi non costituiscono due record distinti.

Per includere tutti i record, sostituire UNION con UNION ALL nell'istruzione SQL. Questo influirà principalmente sull'ordinamento dei risultati, quindi è consigliabile includere anche una clausola ORDER BY per determinare la direzione dell'ordinamento. Ecco l'istruzione SQL basata sull'esempio precedente modificato:

SELECT [Purchase Order Details].[Date Received], Null As [Total], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

UNION ALL

SELECT Max([Date Received]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

ORDER BY [Total];

Passare alla visualizzazione Foglio dati in cui dovrebbero essere mostrati tutti i dettagli e un totale come ultimo record:

Data di ricezione

Totale

Quantità

22/01/2006

 

100

22/01/2006

 

100

22/01/2006

Totale

200

Una query di unione viene spesso usata come origine record per un controllo casella combinata in una maschera. La casella combinata può essere usata per selezionare un valore per filtrare i record della maschera, ad esempio per filtrare i record in base alla città.

Per vedere come funziona, ecco un altro esempio che si può creare nel database di esempio Northwind per illustrare questo scenario.

  1. Creare una query di selezione semplice con la sintassi SQL:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
  2. Passare alla visualizzazione Foglio dati in cui dovrebbero essere mostrati i risultati seguenti:

    Città

    Filtro

    Milano

    Roma

    Palermo

    Palermo

    Torino

    Torino

    Ravenna

    Ravenna

    Milano

    Milano

    Torino

    Torino

    Milano

    Milano

    Torino

    Torino

    Milano

    Milano

  3. Osservando i risultati, potrebbero mancare diversi valori. Espandere la query e trasformarla in una query di unione usando l'istruzione SQL seguente:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
  4. Passare alla visualizzazione Foglio dati in cui dovrebbero essere mostrati i risultati seguenti:

    Città

    Filtro

    <Tutto>

    *

    Palermo

    Palermo

    Ravenna

    Ravenna

    Torino

    Torino

    Milano

    Milano

    Access esegue l'unione dei nove record, mostrati in precedenza, con i valori del campo fisso <Tutto> e "*".

    Questa clausola di unione non contiene UNION ALL, quindi Access restituisce solo record distinti. Ciò significa che ogni città viene restituita una sola volta con valori fissi identici.

  5. Dopo aver completato una query di unione che visualizza una sola volta ogni nome di città, insieme all'opzione che seleziona in modo efficace tutte le città, è possibile usare questa query come origine record per una casella combinata in una maschera. Usando questo esempio come modello, è possibile creare un controllo casella combinata in una maschera, impostare questa query come origine record, impostare la proprietà Larghezza colonne della colonna Filtro su 0 (zero) per nasconderla visivamente e quindi impostare la proprietà Colonna associata su 1 per indicare l'indice della seconda colonna. Nella proprietà Filter della maschera è quindi possibile aggiungere codice come quello illustrato di seguito per attivare un filtro maschera usando il valore di quanto selezionato nel controllo casella combinata:

    Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'"
    Me.FilterOn = True

    L'utente della maschera può quindi filtrare i record della maschera per un nome di città specifico o selezionare <Tutto> per visualizzare un elenco con tutti i record di tutte le città.

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.

×