Queries

2.31 Le query unione
  Roberto

Quando si inizia ad usare Access è naturale che le query vengano create usando la griglia di struttura e spesso si continua così anche dopo che si è presa un po' di confidenza con SQL (Structured Query Language).
Però non tutte le query possono essere create tramite la griglia di struttura, alcuni tipi possono essere create solo direttamente con SQL, così che spesso le query che non possono essere create con la griglia di struttura vengono ignorate, privandosi così di strumenti a volte molto potenti.
Tra questi tipi di query ci sono le query unione.
Le query di unione combinano in un solo campo i campi corrispondenti contenuti in due o più tabelle o query. Quando si esegue una query di unione, tale query restituisce i record contenuti in campi corrispondenti nelle tabelle o nelle query incluse.
Di fatto una query unione non è altro che una query che contiene due o più istruzioni SELECT unite tra loro dalla parola UNION; il punto e vigola con cui finisce il codice SQL di una query unione deve essere scritto solamente dopo l'ultima istruzione SELECT.
E' necessario che ciascuna istruzione SELECT contenuta in una query unione restituisca lo stesso numero di campi nello stesso ordine e che i campi corrispondenti abbiano tipi di dati compatibili, con un'eccezione: è possibile utilizzare un campo Testo ed un campo Numerico come campi corrispondenti.
Qualora i campi corrispondenti non hanno lo stesso nome, ai campi corrispondenti si assocerà lo stesso alias.
Le query unione vengono usate in un database Access per risolvere diversi tipi di problematiche; qui di seguito ne esemplificheremo tre tra quelle che trovano la loro soluzione classica appunto con una query unione.

Accodare i dati di due o più tabelle
L'uso per eccellenza di una query unione è quello di creare una query in cui risultino accodati i dati contenuti in due o più tabelle.
Ipotizziamo di avere le seguenti tre tabelle che abbiano le seguenti tre strutture:
Tabella1
-----------
ID1                       Chiave primaria
RgioneSociale1    Testo
Indirizzo1             Testo
Tabella2
-----------
ID2                       Chiave primaria
RgioneSociale2    Testo
Indirizzo2             Testo
Tabella3
-----------
ID3                       Chiave primaria
RgioneSociale3    Testo
Indirizzo3             Testo
la query unione che visualizzerà accodati i dati delle tre tabelle avrà il seguente codice SQL:
SELECT ID1 As ID, RagioneSociale1 As RagioneSociale, Indirizzo1 As Indirizzo
FROM Tabella1
UNION SELECT ID2 As ID, RagioneSociale2 As RagioneSociale, Indirizzo2 As Indirizzo
FROM Tabella2
UNION SELECT ID3 As ID, RagioneSociale3 As RagioneSociale, Indirizzo3 As Indirizzo
FROM Tabella3;
Naturalmente se tutte e tre la tabelle avessero avuto la stessa struttura e quindi i campi corrispondenti avessero gli stessi nomi, si sarebbe fatto a meno di usare gli alias e quindi avremmo usato il seguente codice SQL::
SELECT ID, RagioneSociale, Indirizzo
FROM Tabella1
UNION SELECT ID, RagioneSociale, Indirizzo
FROM Tabella2
UNION SELECT ID, RagioneSociale, Indirizzo
FROM Tabella3;
Lista con totali
Non necesariamente le istrizioni SELECT contenute in una query unione debbono essere dello stesso tipo: se ad esempio si unisce una semplice istruzione SELECT di selezione con una o più istruzioni SELECT di raggruppamento con totali, sarà possibile ottenere una query che visualizza una lista con totali.
Ipotizziamo di avere una tabella chiamata tblMovimenti che abbia una struttura simile a questa:
ID                                          Contatore e chiave primaria
CodProdotto                         Testo
DescrizioneMovimento          Testo
QtàMovimento                      Numerico
Per creare una query che visualizzi la lista dei record contenuti nella tabella con inframezzati i totali del campo QtàMovimento al livello di CodProdotto e quindi chiudere la lista con il totale generale del campo QtàMovimento, si crerà una query unione che abbia il seguente codice SQL:
SELECT Null As Tipo, CodProdotto, "   " & DescrizioneMovimento As Descrizione, QtàMovimento As Quantità
FROM tblMovimenti
UNION SELECT Null As Tipo, CodProdotto,  " TOTALE PRODOTTO" AS Descrizione, Sum(QtàMovimento) AS Quantità
FROM tblMovimenti
GROUP BY CodProdotto
UNION SELECT "*" As Tipo, Null As CodProdotto, "TOTALE GENERALE" As Descrizione, Sum(QtàMovimento) AS Quantità
FROM tblMovimenti;
Suddividere su più righe i dati contenuti nei campi di un record
Si usa una query unione anche nel caso in cui si voglia ventilare su più righe i dati contenuti nei vari campi di un record.
Ipotizziamo di avere una tabella chiamata Orari che abbia una struttura simile a questa:
MiaData         Data/ora e chiave primaria
Orario1          Data/ora
Orario2          Data/ora
Orario3          Data/ora
Si può suddividere i dati dei tre campi orario su tre record diversi con una query unione che abbia il seguente codice SQL:
SELECT MiaData, "Orario1" As Descrizione, Orario1 As Orario
FROM Orari
UNION SELECT MiaData, "Orario2" As Descrizione, Orario2 As Orario
FROM Orari
UNION SELECT MiaData, "Orario3" As Descrizione, Orario3 As Orario
FROM Orari;
Esistono poi altre situazioni nelle quali l'utilizzo di una query unione sia opportuno e conveniente, ma una volta capito il suo meccanismo non sarà difficile localizzarle.
Naturalmente una query unione può essere usata anche come tabella derivata nella proposizione FROM di un'altra query; un esempio di questo lo si può trovare nella Sezione Queries di questo sito, nella FAQ intitolata 2.29 Query a campi incrociati per la trasposizione righe-colonne.


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.