Időnként előfordulhat, hogy egy tábla vagy lekérdezés rekordjait egy vagy több egyéb táblával egy listába összesítve szeretne egy rekordkészletet létrehozni – egy olyan listában, amely a két vagy több tábla összes rekordját tartalmazza. Ez a célja az Accessben az egyesítő lekérdezéseknek.
Az egyesítő lekérdezések megértéséhez először meg kell ismerkednie az alapszintű választó lekérdezés összeállításával az Accessben. A választó lekérdezések összeállításáról az Egyszerű választó lekérdezés létrehozása című cikkben olvashat bővebben.
Egy működő egyesítő lekérdezés példájának tanulmányozása
Ha még soha nem hozott létre egyesítő lekérdezést, hasznosnak találhatja, ha először tanulmányoz egy működő példát a Northwind Access-sablonban. A Northwind mintasablont az Access Első lépések lapján keresheti meg a Fájl > Új elemre kattintva, illetve közvetlenül is letöltheti egy példányát innen: Northwind mintasablon.
Miután az Access megnyitotta a Northwind adatbázist, zárja be az először megjelenő bejelentkezési párbeszédpanelt, majd bontsa ki a navigációs ablakot. Kattintson a navigációs ablak tetejére, és az objektumtípust kijelölve típus szerint rendszerezze az összes adatbázis-objektumot. Ezután a Lekérdezések csoportot kibontva láthatja a Terméktranzakciók lekérdezést.
Az egyesítő lekérdezések egyszerűen megkülönböztethetők a többi lekérdezésobjektumtól, mivel két egybefonódó körre hasonlító speciális ikon jelzi őket, amely két halmazból egyesített halmazt képvisel:
A normál választó és módosító lekérdezésekkel ellentétben az egyesítő lekérdezésekben a táblák nem kapcsolódnak, ennek következtében az Access grafikus lekérdezéstervezője nem használható az egyesítő lekérdezések összeállítására vagy szerkesztésére. Ezt akkor tapasztalja, ha a navigációs ablakból nyit meg egy egyesítő lekérdezést; az Access megnyitja azt, és az eredményt Adatlap nézetben megjeleníti. A Kezdőlap lap Nézetek csoportjában felfigyelhet arra, hogy az egyesítő lekérdezések használatakor nem áll rendelkezésre a Tervező nézet. Az egyesítő lekérdezések használatakor csak az Adatlap nézet és az SQL nézet között válthat.
Az egyesítő lekérdezésminta további tanulmányozásához kattintson a Kezdőlap > Nézetek > SQL nézet elemre az azt meghatározó SQL szintaxis megtekintéséhez. Ebben a bemutatóban plusz térközöket vettünk fel az SQL szintaxisba, hogy jól láthassa az egyesítő lekérdezést alkotó különböző részeket.
Vegyük szemügyre részletesen a Northwind adatbázisbeli egyesítő lekérdezés SQL szintaxisát:
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;
Az SQL-utasítás első és harmadik része alapvetően két választó lekérdezés. Ezek a lekérdezések két különböző rekordhalmazt kérdeznek le; egyiket a Termékrendelések táblából és a másikat a Termékbeszerzések táblából.
Az SQL-utasítás második része a UNION kulcsszó, amely azt jelzi az Accessnek, hogy egyesíteni fogja ezt a két rekordhalmazt.
Az SQL-utasítás utolsó része egy ORDER BY utasítást használva határozza meg az egyesített rekordok sorrendjét. Ebben a példában az Access az összes rekordot a Rendelve mező szerint rendezi, csökkenő sorrendben.
Megjegyzés: Az egyesítő lekérdezések mindig írásvédettek az Accessben; Adatlap nézetben semmilyen értéket sem módosíthat.
Egyesítő lekérdezés létrehozása választó lekérdezések létrehozásával és egyesítésével
Még ha az SQL szintaxist közvetlenül beírva az SQL nézetbe létre is hozhat egyesítő lekérdezést, választó lekérdezésekkel egyszerűbb azt részenként összeállítani. Ezután a vágólapra másolhatja és beillesztheti az SQL-részeket egy kombinált egyesítő lekérdezésbe.
Ha a lépéseket kihagyva inkább egy példát szeretne megnézni, tanulmányozza a következő, az Egyesítő lekérdezés összeállításának példája című szakaszt.
-
Kattintson a Létrehozás lap Lekérdezések csoportjának Lekérdezéstervező gombjára.
-
Kattintson duplán arra a táblára, amely a belefoglalni kívánt mezőket tartalmazza. Ezzel felveszi a táblát a lekérdezéstervező ablakába.
-
A lekérdezéstervező ablakban kattintson duplán az egyes felvenni kívánt mezőkre. A mezők kiválasztása során ügyeljen arra, hogy ugyanannyi számú mezőt, ugyanolyan sorrendben adjon hozzá a választó lekérdezésekhez. Különösen ügyeljen a mezők adattípusára, és győződjön meg arról, hogy azok kompatibilisek az egyesítéshez használt többi lekérdezéssel. Ha például az első választó lekérdezésben öt mező van, és ezek közül az első dátum/idő típusú adatokat tartalmaz, akkor győződjön meg arról, hogy az egyesítendő többi választó lekérdezésben is ennyi mező van, és az első mező adatai mindegyikben dátum/idő típusúak.
-
Tetszés szerint feltételeket adhat meg a mezőkhöz, ha beírja a megfelelő kifejezéseket a mezőrács Feltétel sorába.
-
Miután végzett a mezők és a mezőfeltételek megadásával, futtassa a választó lekérdezést, és tekintse át az eredményt. A Tervezés lap Eredmények csoportjában kattintson a Futtatás gombra.
-
Váltson át Tervező nézetre.
-
Mentse és hagyja nyitva a választó lekérdezést.
-
Ismételje meg a fenti lépést a többi egyesíteni kívánt választó lekérdezésnél.
Most, hogy létrehozta a választó lekérdezéseket, ideje egyesíteni őket. Ebben a lépésben az SQL-utasítások vágólapra másolásával és beillesztésével létrehozza az egyesítő lekérdezést.
-
Kattintson a Létrehozás lap Lekérdezések csoportjának Lekérdezéstervező gombjára.
-
A Tervezés lap Lekérdezés csoportjában kattintson az Egyesítő gombra. Az Access elrejti a lekérdezéstervező ablakot, és megjeleníti az SQL nézet objektumlapot. Ekkor az SQL nézet objektumlap üres.
-
Kattintson az egyesítő lekérdezésben egyesíteni kívánt első választó lekérdezés fülére.
-
Kattintson a Kezdőlap lap Nézet> SQL nézet parancsára.
-
Másolja a vágólapra a választó lekérdezés SQL-utasítását. Kattintson annak az egyesítő lekérdezésnek a fülére, amelyet korábban kezdett el létrehozni.
-
Illessze be a választó lekérdezés SQL-utasítását az egyesítő lekérdezés SQL nézetének objektumlapjára.
-
Törölje a választó lekérdezés SQL-utasításának végéről a pontosvesszőt (;).
-
Az Enter billentyűt lenyomva léptesse egy sorral lejjebb a kurzort. Írja be a UNION kulcsszót az új sorba.
-
Kattintson az egyesíteni kívánt következő választó lekérdezés fülére.
-
Ismételje meg az 5–10. lépést, amíg ki nem másolta és beillesztette a választó lekérdezések összes SQL-utasítását az egyesítő lekérdezés SQL-nézetablakába. Ne törölje a pontosvesszőt, és ne írjon be semmit a legutóbbi választó lekérdezés SQL-utasítása után.
-
A Tervezés lap Eredmények csoportjában kattintson a Futtatás gombra.
Az egyesítő lekérdezés eredményei Adatlap nézetben jelennek meg.
Egyesítő lekérdezés összeállításának példája
Itt láthat egy példát, amelyet újból létrehozhat a Northwind mintaadatbázisban. Ez az egyesítő lekérdezés összegyűjti a személyek neveit a Vevők táblából, és egyesíti őket a Szállítók táblában található személyek nevével. Ha végig szeretné követni a műveletet, végezze el ezeket a lépéseket a Northwind mintaadatbázis saját példányában.
Az alábbi lépéseket kell megtenni a példa összeállításához:
-
Hozzon létre két, Lekérdezés1 és Lekérdezés 2 nevű választó lekérdezést, amelynek az adatforrása a Vevők és a Szállítók tábla. Megjelenítendő értékként használja a vezetéknevet és az utónevet.
-
Hozzon létre egy Lekérdezés3 nevű új lekérdezést kezdetben adatforrás nélkül, majd a Tervezés lapon az Egyesítő parancsra kattintva alakítsa át egyesítő lekérdezéssé.
-
Másolja a vágólapra a Lekérdezés1 és a Lekérdezés2 nevű lekérdezésből az SQL-utasításokat, és illessze be a Lekérdezés3 nevű lekérdezésbe. Távolítsa el a plusz pontosvesszőt, és vegye fel a UNION kulcsszót. Ezután ellenőrizheti az eredményeket Adatlap nézetben.
-
Vegyen fel egy rendezési záradékot az egyik lekérdezésbe, majd illessze be az ORDER BY utasítást az egyesítő lekérdezés SQL nézetébe. Figyelje meg, hogy amikor a Lekérdezés3 egyesítő lekérdezésben rendezést fűz hozzá, először a pontosvesszőket távolítja el a mezőnevekből, majd a tábla nevét.
-
Az egyesítő lekérdezés példájának neveit egyesítő és rendszerező végső SQL az alábbi:
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];
Ha jól ismeri az SQL szintaxisok írását, bizonyosan be tudja írni a saját SQL-utasítását az egyesítő lekérdezéshez közvetlenül az SQL nézetben. Hasznosnak találhatja azonban, ha követi az SQL egyéb lekérdezési objektumokból való másolásának és beillesztésének módját. Az egyes lekérdezések sokkal összetettebbek lehetnek, mint az itt használt egyszerű választó lekérdezés. Érdemes minden lekérdezést gondosan létrehozni és tesztelni, mielőtt egyesítő lekérdezésbe kombinálná őket. Ha nem fut az egyesítő lekérdezés, egyesével módosíthatja a lekérdezéseket, amíg sikeres nem lesz, majd a javított szintaxissal újra összeállíthatja az egyesítő lekérdezést.
A jelen cikk hátralévő szakaszait tanulmányozva további tippeket és trükköket tudhat meg az egyesítő lekérdezések használatáról.
Az előző szakaszban a Northwind adatbázis használatával készült példában csak két tábla adatait egyesítettük. Az egyesítő lekérdezésekben azonban három vagy több táblát is könnyedén egyesíthet. Az előző példára építve például érdemes lehet szerepeltetni az alkalmazottak nevét a lekérdezés eredményében. A feladat elvégzéséhez vegyen fel egy harmadik lekérdezést, és egyesítse az előző SQL-utasítást egy további UNION kulcsszóval, például ezzel:
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];
Amikor Adatlap nézetben tekinti meg az eredményt, az összes alkalmazott a mintacég nevével együtt fog szerepelni a listában, ami valószínűleg nem túl praktikus. Ha azt szeretné, hogy a mező jelezze, hogy egy személy belső alkalmazott, szállító vagy vevő, a cég neve helyett szerepeltethet egy rögzített értéket. Az SQL az alábbiak szerint nézne ki:
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];
A lekérdezés eredménye így jelenik meg Adatlap nézetben. Az Access ezt az öt mintarekordot jeleníti meg:
Foglalkoztatás |
Utónév |
Vezetéknév |
Belső |
Kőszegi |
Emília |
Belső |
Molnár |
Ilona |
Szállító |
Harmath |
Zoltán |
Vevő |
Papp |
Gábor |
Vevő |
Budai |
Péter |
A fenti lekérdezés tovább csökkenthető, mivel az Access az egyesítő lekérdezésekben csak az első lekérdezésből olvassa be a kimeneti mezők nevét. Itt láthatja, hogy eltávolítottuk az eredményt a második és a harmadik lekérdezési szakaszból:
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];
Az Access egyesítő lekérdezéseiben csak egyszer engedélyezett a rendezés, de minden lekérdezés egyénileg szűrhető. Az előző szakasz egyesítő lekérdezése alapján itt látható egy példa arra, hogy egy WHERE záradékot hozzáadva hol szűrtük az egyes lekérdezéseket.
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];
Adatlap nézetre váltva ehhez hasonló eredmények jelenjenek meg:
Foglalkoztatás |
Utónév |
Vezetéknév |
Szállító |
Balázs |
Erzsébet |
Belső |
Kőszegi |
Emília |
Vevő |
Balogh |
László |
Belső |
Takács |
Anna |
Szállító |
Biber |
Attila |
Vevő |
Horváth |
Sándor |
Szállító |
Lukács |
Tibor |
Szállító |
Pozsony |
Balázs |
Belső |
Kiss |
István |
Szállító |
Dobándi |
Barbara |
Belső |
Varga |
György |
Ha az egyesítendő lekérdezések nagyon eltérnek, olyan helyzet fordulhat elő, ahol egy kimeneti mezőnek különböző típusú adatokat kell egyesítenie. Ebben az esetben az egyesítő lekérdezés többnyire szöveges adattípusként fogja visszaadni az eredményt, mivel ez az adattípus szöveget és számokat is tartalmazhat.
Ennek megértéséhez használjuk a Terméktranzakciók egyesítő lekérdezést a Northwind mintaadatbázisban. Nyissa meg a mintaadatbázist, majd a Terméktranzakciók lekérdezést Adatlap nézetben. Az utolsó tíz rekordnak ehhez hasonlónak kell lennie:
Termékszám |
Rendelve |
Cég neve |
Tranzakció |
Mennyiség |
77 |
2006. 01. 22. |
B szállító |
Beszerzés |
60 |
80 |
2006. 01. 22. |
D szállító |
Beszerzés |
75 |
81 |
2006. 01. 22. |
A szállító |
Beszerzés |
125 |
81 |
2006. 01. 22. |
A szállító |
Beszerzés |
200 |
7 |
2006. 01. 20. |
D vállalat |
Értékesítés |
10 |
51 |
2006. 01. 20. |
D vállalat |
Értékesítés |
10 |
80 |
2006. 01. 20. |
D vállalat |
Értékesítés |
10 |
34 |
2006. 01. 15. |
AA vállalat |
Értékesítés |
100 |
80 |
2006. 01. 15. |
AA vállalat |
Értékesítés |
30 |
Tegyük fel, hogy a Mennyiség mezőt kétfelé szeretné osztani – Vásárlás és Eladás részre. Tegyük fel, hogy nulla értéket szeretne rögzíteni az értéket nem tartalmazó mezőhöz. Ehhez az egyesítő lekérdezéshez így fog kinézni az SQL-utasítás:
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;
Adatlap nézetre váltva az utolsó tíz rekord most az alábbi módon jelenik meg:
Termékszám |
Rendelve |
Cég neve |
Tranzakció |
Vásárlás |
Eladás |
74 |
2006. 01. 22. |
B szállító |
Beszerzés |
20 |
0 |
77 |
2006. 01. 22. |
B szállító |
Beszerzés |
60 |
0 |
80 |
2006. 01. 22. |
D szállító |
Beszerzés |
75 |
0 |
81 |
2006. 01. 22. |
A szállító |
Beszerzés |
125 |
0 |
81 |
2006. 01. 22. |
A szállító |
Beszerzés |
200 |
0 |
7 |
2006. 01. 20. |
D vállalat |
Értékesítés |
0 |
10 |
51 |
2006. 01. 20. |
D vállalat |
Értékesítés |
0 |
10 |
80 |
2006. 01. 20. |
D vállalat |
Értékesítés |
0 |
10 |
34 |
2006. 01. 15. |
AA vállalat |
Értékesítés |
0 |
100 |
80 |
2006. 01. 15. |
AA vállalat |
Értékesítés |
0 |
30 |
A példát folytatva mi a teendő, ha azt szeretné, hogy a nullával rendelkező mezők üresek legyenek? Az SQL-t úgy módosíthatja, hogy nulla helyett semmit se jelenítsen meg, ha a Null kulcsszót az alábbihoz hasonló módon adja hozzá:
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;
Ahogyan azonban az Adatlap nézetre váltáskor megfigyelhette, nem várt eredményt kap. A Vásárlás oszlopban minden mező törlődik:
Termékszám |
Rendelve |
Cég neve |
Tranzakció |
Vásárlás |
Eladás |
74 |
2006. 01. 22. |
B szállító |
Beszerzés |
||
77 |
2006. 01. 22. |
B szállító |
Beszerzés |
||
80 |
2006. 01. 22. |
D szállító |
Beszerzés |
||
81 |
2006. 01. 22. |
A szállító |
Beszerzés |
||
81 |
2006. 01. 22. |
A szállító |
Beszerzés |
||
7 |
2006. 01. 20. |
D vállalat |
Értékesítés |
10 |
|
51 |
2006. 01. 20. |
D vállalat |
Értékesítés |
10 |
|
80 |
2006. 01. 20. |
D vállalat |
Értékesítés |
10 |
|
34 |
2006. 01. 15. |
AA vállalat |
Értékesítés |
100 |
|
80 |
2006. 01. 15. |
AA vállalat |
Értékesítés |
30 |
Ez azért fordul elő, mert az Access a mezők adattípusát az első lekérdezésből határozza meg. Ebben az esetben a Null nem szám.
Mi történik tehát, ha megpróbál beszúrni egy üres karakterláncot a mezők üres értékéhez? Az SQL szintaxis ebben az esetben a következőképpen nézhet ki:
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;
Adatlap nézetre váltva láthatja, hogy az Access lekéri a Vásárlás értékeit, de az értékeket szövegre konvertálta. Láthatja, hogy ezek szöveges értékek, mivel az Adatlap nézetben balról jobbra igazítottak. Az első lekérdezésben az üres karakterlánc nem szám, és ez az oka ennek az eredménynek. Azt is megfigyelheti, hogy az Eladás értékeit szintén szövegre konvertálja a program, mivel a beszerzési rekordok üres karakterláncot tartalmaznak.
Termékszám |
Rendelve |
Cég neve |
Tranzakció |
Vásárlás |
Eladás |
74 |
2006. 01. 22. |
B szállító |
Beszerzés |
20 |
|
77 |
2006. 01. 22. |
B szállító |
Beszerzés |
60 |
|
80 |
2006. 01. 22. |
D szállító |
Beszerzés |
75 |
|
81 |
2006. 01. 22. |
A szállító |
Beszerzés |
125 |
|
81 |
2006. 01. 22. |
A szállító |
Beszerzés |
200 |
|
7 |
2006. 01. 20. |
D vállalat |
Értékesítés |
10 |
|
51 |
2006. 01. 20. |
D vállalat |
Értékesítés |
10 |
|
80 |
2006. 01. 20. |
D vállalat |
Értékesítés |
10 |
|
34 |
2006. 01. 15. |
AA vállalat |
Értékesítés |
100 |
|
80 |
2006. 01. 15. |
AA vállalat |
Értékesítés |
30 |
Hogyan oldható meg ez a rejtvény?
Egy megoldás a lekérdezés utasítása, hogy a mező értékeként számot várjon. Ez az alábbi kifejezéssel végezhető el:
IIf(False, 0, Null)
Az ellenőrizendő False feltétel soha nem lesz True, ezért a kifejezés mindig Null értéket ad vissza, de az Access továbbra is kiértékeli mindkét kimeneti lehetőséget, és megállapítja, hogy a kimenet numerikus vagy Null.
Ezt a kifejezést az alábbiak szerint használhatjuk a példánkban:
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;
Felhívjuk a figyelmét arra, hogy a második lekérdezést nem szükséges módosítani.
Adatlap nézetre váltva most már láthatja a kívánt eredményt.
Termékszám |
Rendelve |
Cég neve |
Tranzakció |
Vásárlás |
Eladás |
74 |
2006. 01. 22. |
B szállító |
Beszerzés |
20 |
|
77 |
2006. 01. 22. |
B szállító |
Beszerzés |
60 |
|
80 |
2006. 01. 22. |
D szállító |
Beszerzés |
75 |
|
81 |
2006. 01. 22. |
A szállító |
Beszerzés |
125 |
|
81 |
2006. 01. 22. |
A szállító |
Beszerzés |
200 |
|
7 |
2006. 01. 20. |
D vállalat |
Értékesítés |
10 |
|
51 |
2006. 01. 20. |
D vállalat |
Értékesítés |
10 |
|
80 |
2006. 01. 20. |
D vállalat |
Értékesítés |
10 |
|
34 |
2006. 01. 15. |
AA vállalat |
Értékesítés |
100 |
|
80 |
2006. 01. 15. |
AA vállalat |
Értékesítés |
30 |
Ugyanazon eredmény elérésének másik módja a lekérdezések beillesztése az egyesítő lekérdezésbe egy másik lekérdezéssel:
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
Az Access minden mezőhöz az Ön által megadott adattípus rögzített értékeit adja vissza. Természetesen nem szeretné, hogy a lekérdezés kimenete zavarja az eredményeket, ezért az elkerülendő trükk az, ha a WHERE záradékot False (Hamis) értékre adja:
WHERE False
Ez egy kis trükk, mivel egy mindig hamis, és így a lekérdezés nem ad vissza semmit. Ennek az utasításnak a meglévő SQL-utasítással való egyesítése a következő kész utasítást eredményezi:
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;
Megjegyzés: Az egyesített lekérdezés ebben a példában a Northwind adatbázist használva 100 rekordot ad vissza, míg a két egyéni lekérdezés 58 és 43 rekordot az összesen 101 rekordból. Ennek az eltérésnek az az oka, hogy két rekord nem egyedi. A helyzetnek a UNION ALL segítségével történő megoldásáról a Külön rekordok használata egyesítő lekérdezésekben a UNION ALL segítségével című szakaszban olvashat.
Az egyesítő lekérdezések speciális esete, amikor egy rekordkészletet egyesít egyetlen rekorddal, amely egy vagy több mező összegét tartalmazza.
Itt láthat egy másik példát, amelyet a Northwind mintaadatbázisban hozhat létre az összegek egyesítő lekérdezésekben való létrehozásának szemléltetésére.
-
Hozzon létre egy új egyszerű lekérdezést a sör (Termékszám=34 a Northwind adatbázisban) beszerzésének megtekintése céljából a következő SQL szintaxis használatával:
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];
-
Adatlap nézetre váltva négy beszerzést kell látnia:
Átvételi dátum
Mennyiség
2006. 01. 22.
100
2006. 01. 22.
60
2006. 04. 04.
50
2006. 04. 05.
300
-
Az összeg kiszámításához hozzon létre egy egyszerű összesítő lekérdezést a következő SQL használatával:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))
-
Adatlap nézetre váltva csak egy rekordot kell látnia:
Max átvételi dátum
Összmennyiség
2006. 04. 05.
510
-
Ezt a két lekérdezést egyetlen egyesítő lekérdezésbe kombinálva fűzze a teljes mennyiséget tartalmazó rekordot a beszerzési rekordokhoz:
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];
-
Adatlap nézetre váltva négy beszerzést kell látnia, amelyek mindegyikét a mennyiséget összegző rekord követ:
Átvételi dátum
Mennyiség
2006. 01. 22.
60
2006. 01. 22.
100
2006. 04. 04.
50
2006. 04. 05.
300
2006. 04. 05.
510
Ez az összegek alapszintű felvétele az egyesítő lekérdezésekbe. Érdemes mindkét lekérdezésben szerepeltetni rögzített értékeket (például Részletek és Összesen), ha vizuálisan el szeretné különíteni az összesített rekordot a többi rekordtól. A rögzített értékek használatáról a Három vagy több tábla vagy lekérdezés egyesítése egyesítő lekérdezésben című szakaszban olvashat.
Az Accessben az egyesítő lekérdezések alapértelmezés szerint csak külön rekordokat tartalmaznak. Mi a teendő azonban akkor, ha az összes rekordot szeretné szerepeltetni? Hasznos lehet egy másik példán szemléltetni ezt.
Az előző szakaszban bemutattuk az összeg létrehozását egyesítő lekérdezésben. Módosítsa az egyesítő lekérdezés SQL szintaxisát, hogy tartalmazza a Termékszám= 48 adatot:
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];
Adatlap nézetre váltva kissé félrevezető eredményt láthat:
Átvételi dátum |
Mennyiség |
2006. 01. 22. |
100 |
2006. 01. 22. |
200 |
Egy rekord összesítve természetesen nem eredményezi a mennyiség kétszeresét.
Ezt az eredményt az magyarázza, hogy egy nap kétszer adtak el ugyanolyan mennyiségű csokoládét – a Megrendelés részletei táblában rögzítettek szerint. Alább látható egy egyszerű választó lekérdezés eredménye, amelyben a Northwind mintaadatbázis mindkét rekordja látható:
Megrendeléskód |
Termék |
Mennyiség |
100 |
Northwind Traders csokoládé |
100 |
92 |
Northwind Traders csokoládé |
100 |
A korábban említett egyesítő lekérdezésben láthatja, hogy a Megrendeléskód mező hiányzik, és hogy a két mező nem jelenik meg két külön rekordként.
Ha az összes rekordot fel szeretné venni, az SQL-utasításban a UNION helyett használja a UNION ALL kulcsszót. Ez valószínűleg hatással lesz az eredmények rendezésére, ezért érdemes lehet felvenni egy ORDER BY záradékot a sorrendezés meghatározásához. Itt látható az előző példa alapján módosított SQL szintaxis:
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];
Adatlap nézetre váltva láthatja az összes részletet, utolsó rekordként pedig az összeget:
Átvételi dátum |
Összeg |
Mennyiség |
2006. 01. 22. |
100 |
|
2006. 01. 22. |
100 |
|
2006. 01. 22. |
Összeg |
200 |
Az egyesítő lekérdezések általában rekordforrásként szolgálnak az űrlapokon szereplő kombinált lista vezérlőelemek számára. Ezt a kombinált listát használva kijelölhet egy értéket az űrlap rekordjainak szűréséhez. Ilyen például az alkalmazotti rekordok szűrése a település szerint.
A működés tanulmányozása végett itt láthat egy másik példát, amelyet a Northwind mintaadatbázisban hozhat létre az eset szemléltetésére.
-
Hozzon létre egy egyszerű választó lekérdezést az alábbi SQL szintaxis használatával:
SELECT Employees.City, Employees.City AS Filter FROM Employees;
-
Adatlap nézetre váltva a következő eredményt kell látnia:
Város
Szűrő
Vác
Vác
Pilisborosjenő
Pilisborosjenő
Ráckeve
Ráckeve
Kiskunfélegyháza
Kiskunfélegyháza
Vác
Vác
Ráckeve
Ráckeve
Vác
Vác
Ráckeve
Ráckeve
Vác
Vác
-
Ezt az eredményt megnézve előfordulhat, hogy nem lát sok értéket. Bontsa ki a lekérdezést, és alakítsa át egyesítő lekérdezéssé a következő SQL használatával:
SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;
-
Adatlap nézetre váltva a következő eredményt kell látnia:
Város
Szűrő
<Mind>
*
Pilisborosjenő
Pilisborosjenő
Kiskunfélegyháza
Kiskunfélegyháza
Ráckeve
Ráckeve
Vác
Vác
Az Access egyesíti a korábban látható kilenc rekordot, a <Mind> és a „*” rögzített mezőértékekkel.
Mivel ez az egyesítő záradék nem tartalmazza a UNION ALL kulcsszót, az Access csak a külön rekordokat adja vissza, ami azt jelenti, hogy minden várost csak egyszer ad vissza, rögzített azonos értékkel.
-
Most, hogy már rendelkezik egy kész egyesítő lekérdezéssel, amely minden városnevet csak egyszer jelenít meg, és lehetővé teszi az összes város hatékony kijelölését, felhasználhatja azt egy űrlap kombinált listájának rekordforrásaként. Ezt az adott példát modellként használva létrehozhat egy kombinált lista vezérlőelemet egy űrlapon, beállíthatja ezt a lekérdezést a rekordforrásaként, a Szűrő oszlop Oszlopszélesség tulajdonságát 0 (nulla) értékre állíthatja az elrejtéséhez, majd a Kötött oszlop tulajdonságot 1 értékre állítva megjelölheti a második oszlop indexét. Az űrlap Szűrő tulajdonságában ezután kódot vehet fel a következőhöz hasonlóképpen, hogy a kombinált lista vezérlőelemben kijelölt értéket használva aktiváljon egy űrlapszűrőt:
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
Az űrlap használója ezután szűrheti az űrlaprekordokat egy adott városnévre, vagy a <Mind> elemet választva az összes város összes rekordját felsorolhatja.