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.
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:
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.
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.
-
Nel gruppo Query della scheda Crea fare clic su Struttura query.
-
Fare doppio clic sulla tabella che contiene i campi da includere. La tabella viene aggiunta alla finestra di struttura della query.
-
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.
-
È possibile aggiungere facoltativamente criteri ai campi digitando le espressioni appropriate nella riga Criteri della griglia dei campi.
-
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.
-
Passare alla visualizzazione Struttura della query.
-
Salvare la query di selezione e lasciarla aperta.
-
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.
-
Nel gruppo Query della scheda Crea fare clic su Struttura query.
-
Nel gruppo Query della scheda Struttura fare clic su Unione. Access nasconde la finestra di struttura della query e mostra la scheda dell'oggetto visualizzazione SQL. A questo punto, la scheda dell'oggetto della visualizzazione SQL è vuota.
-
Fare clic sulla scheda della prima query di selezione che si desidera combinare nella query di unione.
-
Nella scheda Home fare clic su Visualizza > Visualizzazione SQL.
-
Copiare l'istruzione SQL per la query di selezione. Fare clic sulla scheda della query di unione che si è iniziato a creare in precedenza.
-
Incollare l'istruzione SQL della query di selezione nella scheda a oggetti Visualizzazione SQL della query di unione.
-
Eliminare il punto e virgola (;) alla fine dell'istruzione SQL della query di selezione.
-
Premere INVIO per spostare il cursore di una riga in basso e quindi digitare UNION nella nuova riga.
-
Fare clic sulla scheda della successiva query di selezione che si desidera combinare nella query di unione.
-
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.
-
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.
Ecco i passaggi necessari per compilare questo esempio:
-
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.
-
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.
-
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.
-
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.
-
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. Naturalmente, non si vuole che l'output di questa query interferisca con i risultati, quindi il trucco consiste nell'includere una clausola WHERE 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.
-
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];
-
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
-
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))
-
Passare alla visualizzazione Foglio dati in cui dovrebbe essere mostrato un solo record:
MaxOfDate Received
SumOfQuantity
05/04/2006
510
-
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];
-
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 |
Un uso comune per una query di unione consiste nel fungere da origine record per un controllo casella combinata in una maschera. È possibile usare questa casella combinata per selezionare un valore per filtrare i record della maschera. Ad esempio, filtrare i record dei dipendenti 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.
-
Creare una query di selezione semplice con la sintassi SQL:
SELECT Employees.City, Employees.City AS Filter FROM Employees;
-
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
-
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;
-
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.
-
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à.