Utilizarea unei interogări de uniune pentru a combina mai multe interogări într-un singur rezultat

Se aplică la
Access pentru Microsoft 365 Access 2024 Access 2021 Access 2019 Access 2016

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:

Captură de ecran a unei pictograme de interogare de uniune în Access. 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.

  1. În fila Creare, în grupul Interogări, faceți clic pe Proiectare interogare.
  2. 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.
  3. Î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.
  4. Opțional, adăugați criterii la câmpuri tastând expresii adecvate în rândul Criterii ale grilei de câmpuri.
  5. 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.
  6. Comutați interogarea la Vizualizarea proiect.
  7. Salvați interogarea de selectare și lăsați-o deschisă.
  8. 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.

  1. În fila Creare, în grupul Interogări, faceți clic pe Proiectare interogare.
  2. Î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ă.
  3. Faceți clic pe fila pentru prima interogare de selectare pe care doriți să o combinați în interogarea de uniune.
  4. În fila Pornire , faceți clic pe Vizualizare>vizualizare SQL.
  5. 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.
  6. Lipiți instrucțiunea SQL pentru interogarea de selectare în fila obiect a Vizualizării SQL a interogării de uniune.
  7. Ștergeți punctul și virgula (;) de la finalul instrucțiunii de interogare SQL de selectare.
  8. Apăsați pe Enter pentru a muta cursorul mai jos cu o linie, apoi tastați UNION pe linia nouă.
  9. Faceți clic pe fila pentru următoarea interogare de selectare pe care doriți să o combinați în interogarea de uniune.
  10. 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.
  11. Î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:

  1. 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.

  2. 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.

  3. 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 UNION cheie. Puteți verifica apoi rezultatele în vizualizarea foaie de date.

  4. 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.

  5. Ultima SQL 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 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.

  1. 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];
    
  2. 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
  3. 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))
    
  4. 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
  5. 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];
    
  6. 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.

  1. Creați o interogare de selectare simplă utilizând această SQL sintaxă:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
    
  2. 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
  3. 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;
    
  4. 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.

  5. 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 Filter formularului 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 = 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.

Începutul paginii