Uneori, se recomandă să listați înregistrările dintr-un tabel sau o interogare cu cele dintr-unul sau mai multe tabele pentru a forma un set de înregistrări - o listă cu toate înregistrările din două sau mai multe tabele. Acesta este scopul unei interogări de uniune în Access.
Pentru a înțelege eficient interogările de tip uniune, ar trebui să fiți mai întâi familiarizat cu proiectarea interogărilor de selectare de bază în Access. Pentru a afla mai multe despre proiectarea interogărilor de selectare, consultați Crearea unei interogări de selectare simple.
Studierea unui exemplu concret de interogare de uniune
Dacă nu ați mai creat până acum o interogare de uniune, ar putea fi util să studiați mai întâi un exemplu concret în șablonul Access Northwind. Puteți căuta eșantionul de șablon Northwind pe pagina de introducere a Access, făcând clic pe Fișier > Nou sau puteți descărca o copie direct din următoarea locație: Eșantion de șablon Northwind.
După ce Access deschide baza de date Northwind, dezactivați formularul de dialog de conectare care apare prima dată, iar apoi extindeți Panoul de navigare. Faceți clic în partea de sus a Panoului de navigare, iar apoi selectați Tip de obiect pentru a organiza toate obiectele din baza de date după tip. Apoi, extindeți grupul Interogări și veți vedea o interogare denumită Tranzacții produs.
Interogările de tip uniune sunt ușor de diferențiat de alte obiecte de interogare, deoarece au o pictogramă specială care seamănă cu două cercuri interconectate reprezentând un set unit din două seturi:
Spre deosebire de interogările de selectare și de acțiune normale, într-o interogare de uniune tabelele nu sunt asociate, ceea ce înseamnă că proiectantul grafic de interogare Access nu poate fi utilizat pentru a genera sau a edita interogări de tip uniune. Veți întâmpina această situație dacă deschideți o interogare de uniune din Panoul de navigare; Access o deschide și afișează rezultatele în vizualizarea foaie de date. Sub comanda Vizualizări de pe fila Pornire, veți observa că Vizualizare proiect nu este disponibilă atunci când lucrați cu interogări de tip uniune. Atunci când lucrați cu interogări de tip uniune, puteți să comutați numai între Vizualizare foaie de date și Vizualizare SQL.
Pentru a continua să studiați acest exemplu de interogare de uniune, faceți clic pe Pornire > Vizualizări > Vizualizare SQL pentru a vizualiza sintaxa SQL care o definește. În această ilustrație, am adăugat câteva spații suplimentare în SQL, astfel încât să puteți vedea cu ușurință diferitele părți care alcătuiesc o interogare de uniune.
Să studiem în detaliu sintaxa SQL a acestei interogări de uniune din baza de date 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;
Prima și a treia parte a acestei instrucțiuni SQL sunt în esență două interogări de selectare. Aceste interogări reiau două seturi diferite de înregistrări; unul din tabelul Comenzi produs și unul din tabelul Achiziții produs.
A doua parte a acestei instrucțiuni SQL este cuvântul cheie UNIUNE care transmite Access că această interogare va combina aceste două seturi de înregistrări.
Ultima parte a acestei instrucțiuni SQL stabilește ordonarea înregistrărilor combinate utilizând o instrucțiune ORDONARE DUPĂ. În acest exemplu, Access va ordona toate înregistrările după câmpul Data comenzii în ordine descendentă.
Notă: Interogările de tip uniune sunt întotdeauna doar în citire în Access; nu puteți modifica nicio valoare din vizualizarea foaie de date.
Crearea unei interogări de uniune prin crearea și combinarea unor interogări de selectare
Deși puteți crea o interogare de uniune scriind direct sintaxa SQL în vizualizarea SQL, ați putea constata că este mai ușor să o generați pe părți cu interogări de selectare. Apoi puteți copia și lipi părțile SQL într-o interogare de uniune combinată.
Dacă doriți să omiteți citirea pașilor și în schimb să urmăriți un exemplu, consultați secțiunea următoare Urmăriți un exemplu de generare a unei interogări de uniune.
-
În fila Creare, în grupul Interogări, faceți clic pe Proiectare interogare.
-
Faceți dublu clic pe tabelul care conține câmpurile pe care doriți să le includeți. Tabelul se adaugă la fereastra de proiectare a interogării.
-
În fereastra de proiectare a interogării, faceți dublu clic pe fiecare dintre câmpurile pe care doriți să le includeți. Pe măsură ce selectați câmpurile, asigurați-vă că adăugați același număr de câmpuri, în aceeași ordine, așa cum adăugați și la celelalte interogări de selectare. Dați mare atenție tipurilor de date din câmpuri și asigurați-vă că ele au tipuri de date compatibile cu câmpurile din aceeași poziție din celelalte interogări pe care le combinați. De exemplu, dacă prima interogare de selectare are cinci câmpuri, dintre care primul conține date de tipul dată/oră, asigurați-vă că fiecare dintre celelalte interogări de selectare pe care le combinați au, de asemenea, cinci câmpuri, dintre care primul conține date de tipul dată/oră etc.
-
Opțional, adăugați criterii la câmpuri tastând expresii adecvate în rândul Criterii ale grilei de câmpuri.
-
După ce terminați de adăugat câmpuri și criterii de câmpuri, trebuie să rulați interogarea de selectare și să îi revizuiți datele de ieșire. În fila Proiectare, în grupul Rezultate, faceți clic pe Rulare.
-
Comutați interogarea la Vizualizarea proiect.
-
Salvați interogarea de selectare și lăsați-o deschisă.
-
Repetați acest procedeu pentru fiecare interogare de selectare pe care o combinați.
Acum că ați creat interogările de selectare, e momentul să le combinați. La acest pas, veți crea interogarea de uniune prin copierea și lipirea instrucțiunilor SQL.
-
În fila Creare, în grupul Interogări, faceți clic pe Proiectare interogare.
-
În fila Proiectare, în grupul Interogare, faceți clic pe Uniune. Access ascunde fereastra de proiectare a interogării și afișează fila obiect a vizualizării SQL. În acest moment, fila obiect a vizualizării SQL este goală.
-
Faceți clic pe fila pentru prima interogare de selectare pe care doriți să o combinați în interogarea de uniune.
-
În fila Pornire, faceți clic pe Vizualizare > Vizualizare SQL.
-
Copiați instrucțiunea SQL pentru interogarea de selectare. Faceți clic pe fila pentru interogarea de uniune pe care ați început să o creați mai devreme.
-
Lipiți instrucțiunea SQL pentru interogarea de selectare în fila obiect a Vizualizării SQL a interogării de uniune.
-
Ștergeți punctul și virgula (;) de la finalul instrucțiunii SQL de interogare de selectare.
-
Apăsați pe Enter pentru a muta cursorul mai jos cu o linie, apoi tastați UNION pe linia nouă.
-
Faceți clic pe fila pentru următoarea interogare de selectare pe care doriți să o combinați în interogarea de uniune.
-
Repetați pașii de la 5 la 10 până ce copiați și lipiți toate instrucțiunile SQL pentru interogările de selectare în fereastra de vizualizare SQL a interogării de uniune. Nu ștergeți punctul și virgula și nu tastați nimic după instrucțiunea SQL pentru ultima interogare de selectare.
-
În fila Proiectare, în grupul Rezultate, faceți clic pe Rulare.
Rezultatele interogării dvs. de uniune apar în vizualizarea Foaie de date.
Urmăriți un exemplu de generare a unei interogări de uniune
Iată un exemplu pe care îl puteți crea din nou în baza de date eșantion Northwind. Această interogare de uniune colectează numele persoanelor din tabelul Clienți și le combină cu numele persoanelor din tabelul Furnizori . Dacă doriți să continuați, parcurgeți acești pași în copia dvs. a bazei de date eșantion Northwind.
Iată pașii necesari pentru a genera acest exemplu:
-
Creați două interogări de selectare denumite Interogare1 și Interogare2 folosind tabelele Clienți și Furnizori ca sursă de date. Utilizați câmpurile Prenume și Nume ca valori de afișare.
-
Creați o interogare nouă denumită Interogare3, inițial fără nicio sursă de date, iar apoi faceți clic pe comanda Uniune din fila Proiectare pentru a transforma această interogare într-o interogare de uniune.
-
Copiați și lipiți instrucțiunile SQL din Interogare1 și Interogare2 în Interogare3. Nu uitați să eliminați punctul și virgula suplimentar și să includeți cuvântul cheie UNION. Puteți verifica apoi rezultatele în vizualizarea foaie de date.
-
Adăugați o clauză de ordonare într-una dintre interogări, iar apoi lipiți instrucțiunea ORDONARE DUPĂ în vizualizarea SQL a interogării de uniune. Observați că în Interogare3, interogarea de uniune, atunci când ordonarea este punctul de a fi adăugată, mai întâi sunt eliminate semnele punct și virgulă, iar apoi numele tabelului din numele de câmpuri.
-
Varianta SQL finală care combină și sortează numele pentru acest exemplu de interogare de uniune este următoarea:
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];
Dacă sunteți obișnuit să scrieți sintaxa SQL, puteți desigur să scrieți propria instrucțiune SQL pentru interogarea de uniune direct în vizualizarea SQL. Cu toate acestea, ar putea fi util să urmați metoda de copiere și lipire a SQL din alte obiecte de interogare. Fiecare interogare poate fi mult mai complicată decât exemplele simple de interogare de selectare utilizate aici. Poate fi avantajos să creați și să testați cu atenție fiecare interogare înainte de a o combina în interogarea de uniune. Dacă interogarea de uniune nu rulează, puteți să ajustați fiecare interogare separat până când reușește, iar apoi să generați din nou interogarea de uniune cu sintaxa corectată.
Consultați secțiunile rămase din acest articol pentru a afla mai multe sfaturi și trucuri despre utilizarea interogărilor de tip uniune.
În exemplul din secțiunea anterioară în care se utiliza baza de date Northwind erau combinate doar datele din două tabele. Însă într-o interogare de uniune puteți combina foarte ușor trei sau mai multe tabele. De pildă, continuând cu exemplul anterior, poate că doriți să includeți și numele angajaților în datele de ieșire ale interogării. Puteți realiza acest lucru adăugând o a treia interogare și combinând instrucțiunea SQL anterioară cu un cuvânt cheie UNION suplimentar după cum urmează:
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];
Atunci când vizualizați rezultatul în vizualizarea foaie de date, toți angajații vor fi listați cu numele de firmă eșantion, ceea ce probabil că nu ajută prea mult. Dacă doriți ca respectivul câmp să indice dacă o persoană este un angajat intern, de la un furnizor sau de la un client, puteți include o valoare fixă în loc de numele firmei. Iată cum ar arăta 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];
Iată cum se afișează rezultatul în vizualizarea foaie de date. Access afișează aceste cinci înregistrări exemplu:
Angajare |
Nume |
Prenume |
Intern |
Olteanu |
Roxana |
Intern |
Chirilă |
Andreea |
Furnizor |
Niculescu |
Alexandru |
Client |
Pescariu |
Andrei |
Client |
Brătianu |
Gabriel |
Interogarea de mai sus poate fi redusă și mai mult, deoarece Access citește numele de câmpuri cu rezultate doar din prima interogare într-o interogare de uniune. Aici puteți observa că am eliminat rezultatul din a doua și a treia secțiune de interogare:
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];
Într-o interogare de uniune Access, ordonarea este permisă o singură dată, însă fiecare interogare poate fi filtrată separat. Pornind de la interogarea de uniune din secțiunea anterioară, iată un exemplu cu locul unde am filtrat fiecare interogare adăugând o clauză UNDE.
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];
Comutați la vizualizarea foaie de date și veți vedea rezultate asemănătoare cu acesta:
Angajare |
Nume |
Prenume |
Furnizor |
Costache |
Ioana A. |
Intern |
Olteanu |
Roxana |
Client |
Antonescu |
Emil |
Intern |
Melinte |
Ana |
Furnizor |
Stănescu |
Iulia |
Client |
Petrescu |
Bogdan |
Furnizor |
Preda |
Valeriu |
Furnizor |
Bănică |
Eugen |
Intern |
Milea |
Ștefan |
Furnizor |
Blaga |
Cătălina |
Intern |
Pârvu |
Anton |
Dacă interogările de uniune sunt foarte diferite, ați putea întâmpina o situație în care un câmp cu rezultate trebuie să combine tipuri diferite de date. În acest caz, de cele mai multe ori interogarea de uniune va returna rezultatele ca tip de date text întrucât acest tip de date poate reține atât text, cât și numere.
Pentru a înțelege cum funcționează aceasta, vom utiliza interogarea de uniune Tranzacții produs în baza de date eșantion Northwind. Deschideți respectiva bază de date eșantion și apoi deschideți interogarea Tranzacții produs în vizualizarea foaie de date. Ultimele zece înregistrări ar trebui să fie asemănătoare cu următorul rezultat:
ID produs |
Data comenzii |
Nume firmă |
Tranzacție |
Cantitate |
77 |
22.01.2006 |
Furnizor B |
Achiziționare |
60 |
80 |
22.01.2006 |
Furnizor D |
Achiziționare |
75 |
81 |
22.01.2006 |
Furnizor A |
Achiziționare |
125 |
81 |
22.01.2006 |
Furnizor A |
Achiziționare |
200 |
7 |
20.01.2006 |
Firma D |
Vânzare |
10 |
51 |
20.01.2006 |
Firma D |
Vânzare |
10 |
80 |
20.01.2006 |
Firma D |
Vânzare |
10 |
34 |
15.01.2006 |
Firma AA |
Vânzare |
100 |
80 |
15.01.2006 |
Firma AA |
Vânzare |
30 |
Să presupunem că doriți să divizați câmpul Cantitate în două: Cumpărare și Vânzare. Să presupunem, de asemenea, că doriți să aveți o valoare zero fixă pentru câmpul fără valoare. Iată cum va arăta SQL pentru această interogare de uniune:
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;
În cazul în care comutați la vizualizarea foaie de date, veți vedea ultimele zece înregistrări afișate acum astfel:
ID produs |
Data comenzii |
Nume firmă |
Tranzacție |
Cumpărare |
Vânzare |
74 |
22.01.2006 |
Furnizor B |
Achiziționare |
20 |
0 |
77 |
22.01.2006 |
Furnizor B |
Achiziționare |
60 |
0 |
80 |
22.01.2006 |
Furnizor D |
Achiziționare |
75 |
0 |
81 |
22.01.2006 |
Furnizor A |
Achiziționare |
125 |
0 |
81 |
22.01.2006 |
Furnizor A |
Achiziționare |
200 |
0 |
7 |
20.01.2006 |
Firma D |
Vânzare |
0 |
10 |
51 |
20.01.2006 |
Firma D |
Vânzare |
0 |
10 |
80 |
20.01.2006 |
Firma D |
Vânzare |
0 |
10 |
34 |
15.01.2006 |
Firma AA |
Vânzare |
0 |
100 |
80 |
15.01.2006 |
Firma AA |
Vânzare |
0 |
30 |
Continuând acest exemplu, ce puteți face dacă doriți golirea câmpurilor cu zero? Puteți modifica SQL să nu afișeze nimic în loc de zero adăugând cuvântul cheie Null după cum urmează:
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;
Cu toate acestea, așa cum probabil ați observat, comutând la vizualizarea foaie de date, acum aveți un rezultat neașteptat. În coloana Cumpărare, fiecare câmp este golit:
ID produs |
Data comenzii |
Nume firmă |
Tranzacție |
Cumpărare |
Vânzare |
74 |
22.01.2006 |
Furnizor B |
Achiziționare |
||
77 |
22.01.2006 |
Furnizor B |
Achiziționare |
||
80 |
22.01.2006 |
Furnizor D |
Achiziționare |
||
81 |
22.01.2006 |
Furnizor A |
Achiziționare |
||
81 |
22.01.2006 |
Furnizor A |
Achiziționare |
||
7 |
20.01.2006 |
Firma D |
Vânzare |
10 |
|
51 |
20.01.2006 |
Firma D |
Vânzare |
10 |
|
80 |
20.01.2006 |
Firma D |
Vânzare |
10 |
|
34 |
15.01.2006 |
Firma AA |
Vânzare |
100 |
|
80 |
15.01.2006 |
Firma AA |
Vânzare |
30 |
Motivul pentru care se întâmplă acest lucru este că Access stabilește tipurile de date ale câmpurilor din prima interogare. În exemplul de față, Nul nu este un număr.
Așadar, ce se întâmplă dacă încercați și inserați un șir gol pentru valoarea necompletată a câmpurilor? SQL pentru această încercare poate arăta astfel:
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;
Atunci când comutați la vizualizarea foaie de date, veți vedea că Access preia valorile Cumpărare, însă acesta a convertit valorile în text. Ați putea spune că acestea sunt valori text deoarece sunt aliniate la stânga în vizualizarea foaie de date. Șirul gol din prima interogare nu este un număr, motiv pentru care vedeți aceste rezultate. Veți mai observa că și valorile Vânzare sunt convertite în text, deoarece înregistrările achiziției conțin un șir gol.
ID produs |
Data comenzii |
Nume firmă |
Tranzacție |
Cumpărare |
Vânzare |
74 |
22.01.2006 |
Furnizor B |
Achiziționare |
20 |
|
77 |
22.01.2006 |
Furnizor B |
Achiziționare |
60 |
|
80 |
22.01.2006 |
Furnizor D |
Achiziționare |
75 |
|
81 |
22.01.2006 |
Furnizor A |
Achiziționare |
125 |
|
81 |
22.01.2006 |
Furnizor A |
Achiziționare |
200 |
|
7 |
20.01.2006 |
Firma D |
Vânzare |
10 |
|
51 |
20.01.2006 |
Firma D |
Vânzare |
10 |
|
80 |
20.01.2006 |
Firma D |
Vânzare |
10 |
|
34 |
15.01.2006 |
Firma AA |
Vânzare |
100 |
|
80 |
15.01.2006 |
Firma AA |
Vânzare |
30 |
Așadar, cum rezolvați această enigmă?
O soluție este aceea de a impune interogării să se aștepte ca valoarea câmpului să fie un număr. Acest lucru se poate realiza cu expresia:
IIf(False, 0, Null)
Condiția de verificat, False, nu va fi niciodată True; astfel, expresia va returna întotdeauna Null, însă Access evaluează în continuare ambele opțiuni de rezultate și stabilește ca rezultatul să fie numeric sau Null.
Iată cum putem utiliza această expresie în exemplul nostru concret:
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;
Rețineți că nu este necesar să modificați a doua interogare.
În cazul în care comutați la vizualizarea foaie de date, veți vedea acum un rezultat pe care îl dorim:
ID produs |
Data comenzii |
Nume firmă |
Tranzacție |
Cumpărare |
Vânzare |
74 |
22.01.2006 |
Furnizor B |
Achiziționare |
20 |
|
77 |
22.01.2006 |
Furnizor B |
Achiziționare |
60 |
|
80 |
22.01.2006 |
Furnizor D |
Achiziționare |
75 |
|
81 |
22.01.2006 |
Furnizor A |
Achiziționare |
125 |
|
81 |
22.01.2006 |
Furnizor A |
Achiziționare |
200 |
|
7 |
20.01.2006 |
Firma D |
Vânzare |
10 |
|
51 |
20.01.2006 |
Firma D |
Vânzare |
10 |
|
80 |
20.01.2006 |
Firma D |
Vânzare |
10 |
|
34 |
15.01.2006 |
Firma AA |
Vânzare |
100 |
|
80 |
15.01.2006 |
Firma AA |
Vânzare |
30 |
O altă metodă pentru a obține același rezultat este să precedați interogările din interogarea de Uniune cu încă o interogare:
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
Pentru fiecare câmp, Access returnează valori fixe ale tipului de date pe care îl definiți. Desigur, nu doriți ca datele de ieșire ale acestei interogări să influențeze rezultatele; pentru a evita acest lucru, trucul este să includeți o clauză WHERE la False:
WHERE False
Este un mic truc deoarece acesta este întotdeauna fals, iar apoi interogarea nu returnează nimic. Combinând această instrucțiune cu SQL-ul existent ajungem la o instrucțiune finalizată după cum urmează:
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;
Notă: Interogarea combinată aici în exemplul de față care utilizează baza de date Northwind returnează 100 de înregistrări, în timp ce cele două interogări individuale returnează 58 și 43 de înregistrări pentru un total de 101 înregistrări. Această discrepanță se datorează faptului că două înregistrări nu sunt unice. Consultați secțiunea Lucrul cu înregistrări distincte în interogări de tip uniune utilizând UNION ALL, pentru a învăța să rezolvați această situație utilizând UNION ALL.
Un caz special pentru o interogare de uniune este să combinați un set de înregistrări cu o singură înregistrare care conține suma unuia sau mai multor câmpuri.
Iată alt exemplu pe care îl puteți crea în baza de date eșantion Northwind pentru a ilustra cum să obțineți un total într-o interogare de uniune.
-
Creați o nouă interogare simplă pentru a vizualiza achiziționarea de bere (ID produs = 34 în baza de date Northwind) utilizând următoarea sintaxă SQL:
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];
-
Comutați la vizualizare foaia de date și ar trebui să vedeți patru achiziții:
Data primirii
Cantitate
22.01.2006
100
22.01.2006
60
04.04.2006
50
05.04.2006
300
-
Pentru a obține totalul, creați o interogare de agregare simplă utilizând următorul SQL:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))
-
Comutați la vizualizarea foaia de date și ar trebui să vedeți o singură înregistrare:
DataMax a primirii
SumăCantitate
05.04.2006
510
-
Combinați aceste două interogări într-o interogare de uniune pentru a adăuga înregistrarea cu cantitatea totală la înregistrările achiziției:
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];
-
Comutați la vizualizarea foaie de date și ar trebui să vedeți cele patru achiziții cu suma fiecăreia urmată de o înregistrare care totalizează cantitatea:
Data primirii
Cantitate
22.01.2006
60
22.01.2006
100
04.04.2006
50
05.04.2006
300
05.04.2006
510
Aceasta acoperă noțiunile de bază privind adăugarea totalurilor într-o interogare de uniune. De asemenea, se recomandă să includeți valori fixe în ambele interogări, cum ar fi „Detaliu” și „Total” pentru a separa vizual înregistrarea totalului de celelalte înregistrări. Puteți revizui utilizând valori fixe în secțiunea Combinarea a trei sau mai multe tabele sau interogări într-o interogare de uniune.
În mod implicit, interogările de tip uniune în Access includ numai înregistrări distincte. Dar cum puteți proceda dacă doriți să includeți toate înregistrările? În acest caz ar putea fi util un alt exemplu.
În secțiunea anterioară, v-am arătat cum să creați un total într-o interogare de uniune. Modificați respectivul SQL al interogării de uniune astfel încât să includă ID produs = 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];
Comutați la vizualizarea foaia de date și ar trebui să vedeți un rezultat oarecum înșelător:
Data primirii |
Cantitate |
22.01.2006 |
100 |
22.01.2006 |
200 |
Desigur, o singură înregistrare nu returnează de două ori cantitatea în total.
Motivul pentru care vedeți acest rezultat este acela că într-o zi aceeași cantitate de bomboane de ciocolată s-a vândut de două ori, după cum este înregistrat în tabelul Detalii comandă de achiziționare. Iată un rezultat al unei interogări de selectare simple care prezintă ambele înregistrări din baza de date eșantion Northwind:
ID comandă de achiziționare |
Product |
Quantity |
100 |
Ciocolată Northwind Traders |
100 |
92 |
Ciocolată Northwind Traders |
100 |
În interogarea de uniune menționată anterior, puteți vedea că câmpul ID comandă de achiziționare nu este inclus și că cele două câmpuri nu formează două înregistrări distincte.
Dacă doriți să includeți toate înregistrările, utilizați UNION ALL în loc de UNION în SQL. Acest lucru va avea foarte probabil un impact asupra sortării rezultatelor; prin urmare, se recomandă să includeți și o clauză ORDONARE DUPĂ pentru a stabili o ordine de sortare. Iată SQL-ul modificat care a generat exemplul anterior:
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];
Comutați la vizualizarea foaie de date și ar trebui să vedeți toate detaliile pe lângă un total ca ultimă înregistrare:
Data primirii |
Total |
Cantitate |
22.01.2006 |
100 |
|
22.01.2006 |
100 |
|
22.01.2006 |
Total |
200 |
O utilizare frecventă pentru o interogare de uniune este aceea de a servi ca sursă de înregistrări pentru un control de casetă combo într-un formular. Puteți utiliza această casetă combo pentru a selecta o valoare în scopul filtrării înregistrărilor formularului. De exemplu, filtrarea înregistrărilor angajaților după localitatea lor.
Pentru a înțelege cum ar putea funcționa acest lucru, iată alt exemplu pe care îl puteți crea în baza de date eșantion Northwind pentru a ilustra acest scenariu.
-
Crearea unei interogări de selectare simple utilizând această sintaxă SQL:
SELECT Employees.City, Employees.City AS Filter FROM Employees;
-
Comutați la vizualizarea foaie de date și ar trebui să vedeți următoarele rezultate:
Localitate
Filtrare
Sibiu
Sibiu
Sinaia
Sinaia
Oradea
Oradea
Cluj
Cluj
Sibiu
Sibiu
Oradea
Oradea
Sibiu
Sibiu
Oradea
Oradea
Sibiu
Sibiu
-
Când analizați aceste rezultate este posibil să nu vedeți multe valori. Extindeți însă interogarea și transformați-o într-o interogare de uniune utilizând următorul SQL:
SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;
-
Comutați la vizualizarea foaie de date și ar trebui să vedeți următoarele rezultate:
Localitate
Filtrare
<Toate>
*
Sinaia
Sinaia
Cluj
Cluj
Oradea
Oradea
Sibiu
Sibiu
Access efectuează o uniune a celor nouă înregistrări afișate anterior, cu valorile de câmp fix <Toate> și „*”.
Întrucât această clauză de uniune nu conține UNION ALL, Access returnează numai înregistrări distincte, ceea ce înseamnă că fiecare localitate este returnată o singură dată cu valori identice fixe.
-
Acum, întrucât aveți o interogare de uniune finalizată care afișează fiecare nume de localitate o singură dată, împreună cu o opțiune care selectează eficient toate localitățile, puteți utiliza această interogare ca sursă de înregistrări pentru o casetă combo într-un formular. Utilizând acest exemplu specific ca model, puteți să creați un control de casetă combo într-un formular, să setați această interogare ca sursă de înregistrări, să setați proprietatea Lățime coloană a coloanei Filtrare la 0 (zero) pentru a o ascunde vizual, iar apoi să setați proprietatea Coloană de legătură la 1 pentru a indica indexul celei de-a doua coloane. În proprietatea Filtrare a formularului propriu-zis, puteți apoi să adăugați un cod, precum următorul, pentru a activa o filtrare după formular utilizând valoarea care a fost selectată în controlul de casetă combo:
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
Utilizatorul formularului poate apoi să filtreze înregistrările formularului după un nume de localitate specific sau să selecteze <Toate> pentru a lista toate înregistrările pentru toate localitățile.