Uneori, se recomandă să combinați înregistrările dintr-un tabel sau o interogare cu înregistrări dintr-unul sau mai multe tabele într-un singur rezultat. Asta face o interogare 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, selectând Fișier>nou. De asemenea, puteți descărca o copie direct de la eșantionul de șablon Northwind.
După ce Access deschide baza de date Northwind, dezactivați caseta de dialog de conectare care apare prima dată, iar apoi extindeți Panoul de navigare. Selectați partea de sus a Panoului de navigare, apoi selectați Tip de obiect pentru a organiza toate obiectele bazei 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. Aceasta înseamnă că nu puteți utiliza proiectantul grafic de interogări Access pentru a genera sau a edita interogări de tip uniune. Dacă deschideți o interogare de uniune din Panoul de navigare, Access o deschide și afișează rezultatele în vizualizarea foaie de date.
Sub Vizualizări, pe fila Pornire, observați că vizualizarea Proiect nu este disponibilă atunci când lucrați cu interogări de tip uniune. Puteți comuta numai între Vizualizarea foaie de date și Vizualizarea SQL.
Pentru a continua să studiați acest exemplu de interogare de uniune, faceți clic pe Vizualizări de pornire>Vizualizare>SQL pentru a vizualiza SQL sintaxa care o definește. În această ilustrație, am adăugat câteva spații suplimentare, astfel SQL încât să puteți vedea cu ușurință diferitele părți care alcătuiesc o interogare de uniune.
Să examinăm SQL în detaliu sintaxa 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 SQL instrucțiuni este cuvântul UNION cheie, care spune programului Access să combine aceste două seturi de înregistrări.
Ultima parte a acestei SQL instrucțiuni stabilește ordinea înregistrărilor combinate utilizând o ORDER BY instrucțiune. În acest exemplu, Access ordonează 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 SQL sintaxa direct î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 are 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 SQL instrucțiunilor.
- Î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 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
SQLpentru 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
SQLpentru 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 de interogareSQLde selectare. - Apăsați pe Enter pentru a muta cursorul mai jos cu o linie, apoi tastați
UNIONpe 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
SQLpentru 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țiuneaSQLpentru 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 recrea î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ă urmați procesul, 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ă adăugați cuvântul
UNIONcheie. Puteți verifica apoi rezultatele în vizualizarea foaie de date.Adăugați o clauză de ordonare la una dintre interogări, apoi lipiți instrucțiunea
ORDER BYîn interogarea de uniune în Vizualizarea SQL. 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.Ultima
SQLcare 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 SQL sintaxa, puteți să scrieți propria SQL instrucțiune 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.
Combinarea a trei sau mai multe tabele sau interogări într-o interogare de uniune
În exemplul din secțiunea anterioară, care utilizează baza de date Northwind, datele din două tabele sunt combinate. Î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ă afișeze dacă o persoană este un angajat intern, de la un furnizor sau de la un client, puteți include o valoare fixă în locul numelui firmei. Iată cum SQL arată:
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 |
Puteți reduce și mai mult interogarea, deoarece Access citește numele câmpurilor cu rezultate doar din prima interogare dintr-o interogare de uniune. Aici, rezultatul din a doua și a treia secțiune de interogare este eliminat:
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];
Filtrarea în interogările de tip uniune
Într-o interogare de uniune Access, ordonarea este permisă o singură dată, dar puteți filtra fiecare interogare separat. Pornind de la interogarea de uniune din secțiunea anterioară, iată un exemplu care filtrează fiecare interogare adăugând o WHERE clauză.
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 |
Amestecarea tipurilor de date
Dacă interogările pe care le unificați 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ă scindați câmpul Cantitate în două câmpuri: Cumpărare și Vânzare. Să presupunem, de asemenea, că doriți o valoare zero fixă pentru câmpul fără valoare. Iată cum SQL arată 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 valori zero? Puteți modifica pentru SQL a nu afișa nimic în loc de zero adăugând cuvântul Null cheie, așa cum se arată aici:
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 să 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. Puteți face acest lucru cu această expresie:
IIf(False, 0, Null)
Condiția de verificat, False, nu este niciodată True, astfel încât expresia returnează Nullîntotdeauna . Cu toate acestea, Access evaluează în continuare ambele opțiuni de ieșire și tratează rezultatul ca număr 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;
Nu trebuie 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
Acesta este un truc mic. Pentru că condiția este întotdeauna falsă, 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ă
În acest exemplu, interogarea combinată din 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ă diferență apare pentru că două înregistrări nu sunt unice. Consultați Lucrul cu înregistrări distincte în interogări de tip uniune utilizând UNION ALL pentru a afla cum să rezolvați această situație utilizând UNION ALL.
Adăugarea de totaluri într-o interogare de uniune
O utilizare 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.
Lucrul cu înregistrări distincte în interogări de tip uniune utilizând UNION ALL
Î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 acea interogare SQL de uniune astfel încât să includă Product ID = 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 totală.
Vedeți acest rezultat deoarece, într-o zi, aceeași cantitate de bomboane de ciocolată s-a vândut de două ori, ca cea î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 UNIONSQL. Acest lucru va afecta cel mai probabil sortarea rezultatelor; prin urmare, se recomandă să includeți ORDER BY o clauză pentru a stabili o ordine de sortare. Iată modificările SQL făcute pe baza exemplului 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 |
Utilizarea unei interogări de uniune pentru filtrarea înregistrărilor într-un formular printr-un control de casetă combo
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.
Creați o interogare de selectare simplă utilizând această
SQLsintaxă: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ătoarele
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 "*". Deoarece această clauză de uniune nu conține
UNION ALL, Access returnează numai înregistrări distincte. Aceasta î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
Filterformularului propriu-zis, puteți adăuga apoi un cod ca următorul pentru a activa un filtru de formular utilizând valoarea selectată în controlul de casetă combo:Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = TrueUtilizatorul 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.