Több lekérdezés eredményének együttes megjelenítése egyesítő lekérdezéssel

Több lekérdezés eredményének együttes megjelenítése egyesítő lekérdezéssel

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.

Megjegyzés:  A jelen cikkben leírt eljárások az asztali Access-adatbázisokhoz használhatók. A webes Access-appokban nem hozható létre és nem használható egyesítő lekérdezés.

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:

Képernyőkép: egyesítő lekérdezés ikonja az Accessben

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.

Ez a böngésző nem támogatja a videók lejátszását. Telepítse a Microsoft Silverlightot, az Adobe Flash Playert vagy az Internet Explorer 9-es verzióját.

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.

  1. Kattintson a Létrehozás lap Lekérdezések csoportjának Lekérdezéstervező gombjára.

  2. A Tábla megjelenítése párbeszédpanelen kattintson duplán arra a táblára, amelyből adatokat kíván lekérdezni. Ezzel felveszi a táblát a lekérdezéstervező ablakába.

  3. Zárja be a Tábla megjelenítése párbeszédpanelt.

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

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

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

  7. Váltson át Tervező nézetre.

  8. Mentse és hagyja nyitva a választó lekérdezést.

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

  1. Kattintson a Létrehozás lap Lekérdezések csoportjának Lekérdezéstervező gombjára.

  2. Zárja be a Tábla megjelenítése párbeszédpanelt.

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

  4. Kattintson az egyesítő lekérdezésben egyesíteni kívánt első választó lekérdezés fülére.

  5. Kattintson a Kezdőlap lap Nézet> SQL nézet parancsára.

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

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

  8. Törölje a választó lekérdezés SQL-utasításának végéről a pontosvesszőt (;).

  9. Az Enter billentyűt lenyomva léptesse egy sorral lejjebb a kurzort. Írja be a UNION kulcsszót az új sorba.

  10. Kattintson az egyesíteni kívánt következő választó lekérdezés fülére.

  11. Ismételje meg az eljárás 5–10. lépését, amíg vágólapra nem másolta és be nem illesztette a választó lekérdezések összes SQL-utasítását az egyesítő lekérdezés SQL nézet ablakában. Ne törölje a pontosvesszőt, és ne írjon semmit az utolsó választó lekérdezés SQL-utasításának végére.

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

Ez a böngésző nem támogatja a videók lejátszását. Telepítse a Microsoft Silverlightot, az Adobe Flash Playert vagy az Internet Explorer 9-es verzióját.

Az alábbi lépéseket kell megtenni a példa összeállításához:

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

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

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

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

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

Ezt a példát folytatva, mi a teendő, ha a nulla értéket tartalmazó mezőket üresen szeretné hagyni? Módosíthatja az SQL szintaxist, hogy a nulla helyett semmi se jelenjen meg. Ehhez adja hozzá a Null kulcsszót az alábbiak szerint:

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ő esetén a definiált adattípusnak megfelelő rögzített értékeket adja vissza. Természetesen nem szeretné, ha a lekérdezés kimenete ütközne az eredményekkel. Ezt úgy kerülheti el, ha egy WHERE záradékot alkalmaz a False feltételhez:

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.

  1. 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];
  2. 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

  3. 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))
  4. Adatlap nézetre váltva csak egy rekordot kell látnia:

    Max átvételi dátum

    Összmennyiség

    2006. 04. 05.

    510

  5. 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];
  6. 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.

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

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

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

Vissza a lap tetejére

Office-jártasság bővítése
Oktatóanyagok megismerése
Új szolgáltatások listájának lekérése
Részvétel az Office Insider programban

Hasznos volt az információ?

Köszönjük a visszajelzését!

Köszönjük visszajelzését. Jobbnak látjuk, ha az Office egyik támogatási szakemberéhez irányítjuk.

×