Niekedy možno budete chcieť vytvoriť zoznam záznamov z jednej tabuľky alebo dotazu s záznamami z jednej alebo viacerých iných tabuliek a vytvoriť jednu množinu záznamov – zoznam so všetkými záznamami z dvoch alebo viacerých tabuliek. Toto je účel zjednocovacieho dotazu v Accesse.
Ak chcete efektívne porozumieť zjednocovacím dotazom, najskôr by ste sa mali oboznámiť s navrhovaním základných výberových dotazov v Accesse. Ďalšie informácie o navrhovaní výberových dotazov nájdete v téme Vytvorenie jednoduchého výberového dotazu.
Preštudovanie funkčného príkladu zjednocovacieho dotazu
Ak ste nikdy predtým nevytvárali zjednocovacie dotazy, možno bude pre vás užitočné, ak si najskôr preštudujete funkčný príklad v accessovej šablóne databázy Northwind. Vzorovú šablónu databázy Northwind môžete vyhľadať na stránke Začíname v Accesse kliknutím na položky Súbor > Nové alebo si môžete stiahnuť kópiu priamo z tohto umiestnenia: Vzorová šablóna databázy Northwind.
Keď Access otvorí databázu Northwind, zrušte dialógové okno prihlásenia, ktoré sa zobrazí ako prvé, a potom rozbaľte navigačnú tablu. Kliknite na hornú časť navigačnej tably a potom výberom položky Typ objektu usporiadajte všetky databázové objekty podľa typu. Potom rozbaľte skupinu Dotazy a zobrazí sa dotaz s názvom Transakcie produktov.
Zjednocovacie dotazy odlíšite od ostatných dotazov jednoducho, pretože sú označené špeciálnou ikonou, ktorá zobrazuje dva prepletené kruhy reprezentujúce množinu spojenú z dvoch množín:
Na rozdiel od bežných výberových a akčných dotazov tabuľky nesúvisia v zjednocovacom dotaze, čo znamená, že návrhára grafických dotazov Accessu nie je možné použiť na vytváranie alebo úpravu zjednocovacích dotazov. Toto sa zobrazí, ak otvoríte zjednocovací dotaz z navigačnej tably. Access ho otvorí a zobrazí výsledky v údajovom zobrazení. Pod príkazom Zobrazenia na karte Domov si všimnete, že návrhové zobrazenie nie je pri práci s zjednocovacími dotazmi k dispozícii. Medzi údajovým zobrazením a zobrazením SQL môžete prepínať len pri práci s zjednocovacími dotazmi.
Ak chcete pokračovať v študovaní tohto príkladu zjednocovacieho dotazu, kliknite na položky Domov > Zobrazenia > Zobrazenie SQL a zobrazí sa syntax SQL, ktorá ho definuje. Do syntaxe SQL sme v tomto znázornení pridali medzery navyše, aby ste mohli jednoducho odlíšiť jednotlivé časti, ktoré tvoria zjednocovací dotaz.
Prezrime si detailne syntax jazyka SQL tohto zjednocovacieho dotazu z databázy 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;
Prvou a treťou časťou tohto príkazu SQL sú v podstate dva výberové dotazy. Tieto dotazy načítavajú dve rôzne množiny záznamov. jeden z tabuľky Objednávky produktov a jeden z tabuľky Nákupy produktov .
Druhá časť tohto príkazu SQL je kľúčové slovo UNION, ktoré Accessu prezrádza, že dotaz skombinuje tieto dve množiny záznamov.
Posledná časť tohto príkazu SQL určuje poradie kombinovaných záznamov pomocou príkazu ORDER BY. V tomto príklade Access zoradí všetky záznamy podľa poľa Order Date v zostupnom poradí.
Poznámka: Zjednocovacie dotazy v Accesse vždy slúžia iba na čítanie. Nie je možné zmeniť žiadne hodnoty v údajovom zobrazení.
Vytvorenie zjednocovacieho dotazu pomocou vytvorenia a skombinovania výberových dotazov
Napriek tomu, že zjednocovací dotaz môžete vytvoriť priamym vpísaním syntaxe SQL do zobrazenia SQL, môže byť pre vás jednoduchšie vytvoriť ho po častiach pomocou výberových dotazov. Potom môžete časti syntaxe SQL skopírovať a prilepiť do skombinovaného zjednocovacieho dotazu.
Ak chcete vynechať čítanie postupu a namiesto toho si príklad pozrieť, prejdite do ďalšej časti, Pozrite si príklad vytvorenia zjednocovacieho dotazu.
-
Na karte Vytvoriť kliknite v skupine Dotazy na položku Návrh dotazu.
-
Dvakrát kliknite na tabuľku obsahujúcu polia, ktoré chcete zahrnúť. Tabuľka sa pridá do okno návrhu dotazu.
-
V okne návrhu dotazu dvakrát kliknite na každé z polí, ktoré chcete zahrnúť. Pri výbere polí pridajte rovnaký počet polí a v rovnakom poradí, ako pridávate do ostatných výberových dotazov. Venujte pozornosť typom údajov polí a skontrolujte, či obsahujú kompatibilné typy údajov s poľami v rovnakej pozícii v ostatných dotazoch, ktoré kombinujete. Ak má napríklad prvý výberový dotaz päť polí, z ktorých prvé obsahuje údaje typu dátum a čas, skontrolujte, či každý z ostatných výberových dotazov, ktoré kombinujete, má takisto päť polí, z ktorých prvé obsahuje údaje typu dátum a čas, a tak ďalej.
-
Voliteľne pridajte do polí kritériá zadaním príslušných výrazov do riadka Kritériá v mriežke poľa.
-
Po dokončení pridávania polí a kritérií polí by ste mali spustiť výberový dotaz a skontrolovať jeho výstup. Prejdite na kartu Návrh a v skupine Výsledky kliknite na položku Spustiť.
-
Prepnite dotaz do návrhového zobrazenia.
-
Uložte výberový dotaz a ponechajte ho otvorený.
-
Zopakujte tento postup pri každom výberovom dotaze, ktorý chcete skombinovať.
Ak ste už vytvorili výberové dotazy, je čas skombinovať ich. V tomto kroku vytvoríte zjednocovací dotaz skopírovaním a prilepením príkazov SQL.
-
Na karte Vytvoriť kliknite v skupine Dotazy na položku Návrh dotazu.
-
Na karte Návrh kliknite v skupine Dotaz na položku Zjednotenie. Access skryje okno návrhu dotazu a zobrazí kartu objektu zobrazenia SQL. V tomto bode bude karta objektu zobrazenie SQL prázdna.
-
Kliknite na kartu pre prvý výberový dotaz, ktorý chcete skombinovať v zjednocovacom dotaze.
-
Na karte Domov kliknite na položky Zobraziť> Zobrazenie SQL.
-
Skopírujte príkaz SQL pre výberový dotaz. Kliknite na kartu pre zjednocovací dotaz, ktorý ste začali vytvárať v predchádzajúcom kroku.
-
Prilepte príkaz SQL pre výberový dotaz do karty objektu v zobrazení SQL zjednocovacieho dotazu.
-
Odstráňte bodkočiarku (;) na konci príkazu SQL výberového dotazu.
-
Stlačením klávesu Enter presuňte kurzor o jeden riadok nadol a do nového riadka zadajte kľúčové slovo UNION.
-
Kliknite na kartu pre ďalší výberový dotaz, ktorý chcete skombinovať v zjednocovacom dotaze.
-
Opakujte kroky 5 až 10, kým neskopírujete a neprilepíte všetky príkazy SQL pre výberové dotazy do okna zobrazenia SQL zjednocovacieho dotazu. Neodstraňujte bodkočiarku ani nezadávajte nič za príkaz SQL pre posledný výberový dotaz.
-
Prejdite na kartu Návrh a v skupine Výsledky kliknite na položku Spustiť.
Výsledky zjednocovacieho dotazu sa zobrazia v údajovom zobrazení.
Pozrite si príklad vytvorenia zjednocovacieho dotazu
Tu je príklad, ktorý môžete znova vytvoriť vo vzorovej databáze Northwind. Tento zjednocovací dotaz zhromažďuje mená ľudí z tabuľky Customers (Zákazníci) a skombinuje ich s menami ľudí z tabuľky Suppliers (Dodávatelia). Ak chcete pokračovať s nami, postupujte podľa nasledujúcich krokov vo svojej kópii vzorovej databázy Northwind.
Kroky potrebné na vytvorenie tohto príkladu:
-
Vytvorte dva výberové dotazy s názvom Dotaz1 a Dotaz2, pričom ako zdroje údajov použite tabuľky Customers (Zákazníci) a Suppliers (Dodávatelia). Použite polia First name (Meno) a Last name (Priezvisko) ako zobrazené hodnoty.
-
Vytvorte nový dotaz s názvom Dotaz3 bez počiatočného zdroja údajov. Ak chcete, aby sa z tohto dotazu stal zjednocovací dotaz, kliknite na príkaz Zjednocovací na karte Návrh.
-
Skopírujte a prilepte príkazy SQL z Dotazu1 a Dotazu2 do Dotazu3. Uistite sa, že ste odstránili nadbytočné bodkočiarky, a dopíšte kľúčové slovo UNION. Potom môžete skontrolovať výsledky v údajovom zobrazení.
-
Pridajte zoraďovaciu klauzulu do jedného z dotazov a potom prilepte príkaz ORDER BY do zobrazenia SQL zjednocovacieho príkazu. Všimnite si, že pri pridávaní zoradenia v zjednocovacom dotaze (Dotaz3) sa najskôr odstránia bodkočiarky, potom sa odstráni názov tabuľky z názvov polí.
-
Konečná podoba syntaxe SQL, ktorá skombinuje a zoradí mená v príklade zjednocovacieho dotazu, vyzerá nasledovne:
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];
Ak dobre rozumiete písaniu syntaxe SQL, určite zvládnete napísať vlastný príkaz SQL pre zjednocovací dotaz priamo do zobrazenia SQL. Možno však pre vás bude užitočný postup, pri ktorom sa kopírujú a prilepujú príkazy SQL z iných objektov dotazu. Jednotlivé dotazy však môžu byť oveľa zložitejšie ako jednoduché výberové dotazy použité v týchto príkladoch. Určite je užitočné všetky dotazy dôsledne vytvoriť a otestovať, kým ich skombinujete do zjednocovacieho dotazu. Ak sa zjednocovací dotaz nepodarí spustiť, môžete každý dotaz upraviť jednotlivo a potom znova vytvoriť zjednocovací dotaz so správnou syntaxou.
Prezrite si aj zostávajúce časti tohto článku a získajte ďalšie tipy a triky na použitie zjednocovacích dotazov.
V predchádzajúcej časti sú v príklade s použitím databázy Northwind skombinované údaje len z dvoch tabuliek. V zjednocovacom dotaze však môžete veľmi jednoducho skombinovať aj tri alebo viac tabuliek. V nadväznosti na predchádzajúci príklad možno budete chcieť napríklad do výstupného dotazu zahrnúť aj mená z tabuľky employees(zamestnanci). Dosiahnete to tak, že pridáte tretí dotaz a pomocou ďalšieho kľúčového slova UNION ho skombinujete s predchádzajúcimi príkazmi SQL takto:
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];
Keď zobrazíte výsledok v údajovom zobrazení, všetci zamestnanci budú v zozname uvedení spolu so vzorovým názvom spoločnosti, a to zrejme nie je veľmi užitočné. Ak chcete, aby pole označovalo, či je osoba interným zamestnancom (in-house) alebo patrí medzi dodávateľov (supplier) či zákazníkov (customer), môžete na miesto názvu spoločnosti vložiť pevnú hodnotu. Príkaz SQL by mal vyzerať takto:
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];
Takto by mali vyzerať výsledky v údajovom zobrazení. Access zobrazí týchto päť vzorových záznamov:
Employment |
Last Name |
First Name |
In-house |
Freehafer |
Nancy |
In-house |
Giussani |
Laura |
Supplier |
Glasson |
Stuart |
Customer |
Goldschmidt |
Daniel |
Customer |
Gratacos Solsona |
Antonio |
Dotaz uvedený vyššie možno skrátiť ešte viac, keďže v zjednocovacom dotaze Access prečíta len mená z výstupných polí z prvého dotazu. Vidíte, že sme odstránili výstup z častí druhého a tretieho dotazu:
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];
V zjednocovacom dotaze Accessu je možné použiť zoradenie iba raz, ale každý z dotazov je možné filtrovať samostatne. V nadväznosti na zjednocovací dotaz z predchádzajúcej časti je v tomto príklade filtrovaný každý dotaz pridaním klauzuly WHERE.
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];
Prepnite na údajové zobrazenie a uvidíte výsledky podobné týmto:
Employment |
Last Name |
First Name |
Supplier |
Andersen |
Elizabeth A. |
In-house |
Freehafer |
Nancy |
Customer |
Hasselberg |
Jonas |
In-house |
Hellung-Larsen |
Anne |
Supplier |
Hernandez-Echevarria |
Amaya |
Customer |
Mortensen |
Sven |
Supplier |
Sandberg |
Mikael |
Supplier |
Sousa |
Luis |
In-house |
Thorpe |
Steven |
Supplier |
Weiler |
Cornelia |
In-house |
Zare |
Robert |
Ak sú dotazy na zjednocovanie veľmi odlišné, môžete sa ocitnúť v situácii, keď musíte vo výstupnom poli skombinovať údaje rozličných typov údajov. Ak to urobíte, zjednocovací dotaz najčastejšie vráti výsledky v podobe typu údajov text, keďže tento typ údajov môže obsiahnuť text aj čísla.
Ak chceme pochopiť, ako to funguje, použijeme zjednocovací dotaz Product Transactions vo vzorovej databáze Northwind. Otvorte túto vzorovú databázu a potom otvorte dotaz Product Transactions v údajovom zobrazení. Posledných desať záznamov by malo sa malo podobať na tento výstup:
Product ID |
Order Date |
Company Name |
Transaction |
Quantity |
77 |
22.1.2006 |
Supplier B |
Purchase |
60 |
80 |
22.1.2006 |
Supplier D |
Purchase |
75 |
81 |
22.1.2006 |
Supplier A |
Purchase |
125 |
81 |
22.1.2006 |
Supplier A |
Purchase |
200 |
7 |
20.1.2006 |
Company D |
Sale |
10 |
51 |
20.1.2006 |
Company D |
Sale |
10 |
80 |
20.1.2006 |
Company D |
Sale |
10 |
34 |
15.1.2006 |
Company AA |
Sale |
100 |
80 |
15.1.2006 |
Company AA |
Sale |
30 |
Povedzme, že chcete pole Quantity (Množstvo) rozdeliť na dve polia – Buy a Sell (Nákup a Predaj). Povedzme tiež, že chcete, aby sa v poli bez hodnoty nachádzala pevná nulová hodnota. Takto bude vyzerať príkaz SQL pre tento zjednocovací dotaz:
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;
Ak prepnete na údajové zobrazenie, posledných desať záznamov sa teraz zobrazí nasledovne:
Product ID |
Order Date |
Company Name |
Transaction |
Buy |
Sell |
74 |
22.1.2006 |
Supplier B |
Purchase |
20 |
0 |
77 |
22.1.2006 |
Supplier B |
Purchase |
60 |
0 |
80 |
22.1.2006 |
Supplier D |
Purchase |
75 |
0 |
81 |
22.1.2006 |
Supplier A |
Purchase |
125 |
0 |
81 |
22.1.2006 |
Supplier A |
Purchase |
200 |
0 |
7 |
20.1.2006 |
Company D |
Sale |
0 |
10 |
51 |
20.1.2006 |
Company D |
Sale |
0 |
10 |
80 |
20.1.2006 |
Company D |
Sale |
0 |
10 |
34 |
15.1.2006 |
Company AA |
Sale |
0 |
100 |
80 |
15.1.2006 |
Company AA |
Sale |
0 |
30 |
Pokračujme v tomto príklade – čo ak sa rozhodnete, že polia s nulovou hodnotou majú byť prázdne? Môžete upraviť príkaz SQL pridaním kľúčového slova Null a namiesto nuly sa zobrazí prázdne pole, ako je to v nasledujúcom príklade:
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;
Ako ste si už isto všimli, po prepnutí na údajové zobrazenie sa zobrazil neočakávaný výsledok. Každé pole v stĺpci Buy (Nákup) je prázdne:
Product ID |
Order Date |
Company Name |
Transaction |
Buy |
Sell |
74 |
22.1.2006 |
Supplier B |
Purchase |
||
77 |
22.1.2006 |
Supplier B |
Purchase |
||
80 |
22.1.2006 |
Supplier D |
Purchase |
||
81 |
22.1.2006 |
Supplier A |
Purchase |
||
81 |
22.1.2006 |
Supplier A |
Purchase |
||
7 |
20.1.2006 |
Company D |
Sale |
10 |
|
51 |
20.1.2006 |
Company D |
Sale |
10 |
|
80 |
20.1.2006 |
Company D |
Sale |
10 |
|
34 |
15.1.2006 |
Company AA |
Sale |
100 |
|
80 |
15.1.2006 |
Company AA |
Sale |
30 |
Stalo sa to preto, lebo Access určuje typy údajov polí z prvého dotazu. V tomto príklade nie je hodnota Null číslom.
Čo sa teda stane, ak sa pokúsite vložiť prázdny reťazec pre prázdne hodnoty polí? Pri tomto pokuse by syntax SQL mohla vyzerať nasledovne:
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;
Keď prepnete na údajové zobrazenie, zistíte, že Access načítal hodnoty stĺpca Buy (Nákup), ale konvertoval ich na text. Viete, že ide o textové hodnoty, pretože v údajovom zobrazení sú zarovnané doľava. Prázdny reťazec v prvom dotaze nie je číslo, preto sa zobrazia takéto výsledky. Taktiež si všimnite, že hodnoty stĺpca Sell (Predaj) sú tiež konvertované na text, pretože záznamy o nákupe obsahujú prázdny reťazec.
Product ID |
Order Date |
Company Name |
Transaction |
Buy |
Sell |
74 |
22.1.2006 |
Supplier B |
Purchase |
20 |
|
77 |
22.1.2006 |
Supplier B |
Purchase |
60 |
|
80 |
22.1.2006 |
Supplier D |
Purchase |
75 |
|
81 |
22.1.2006 |
Supplier A |
Purchase |
125 |
|
81 |
22.1.2006 |
Supplier A |
Purchase |
200 |
|
7 |
20.1.2006 |
Company D |
Sale |
10 |
|
51 |
20.1.2006 |
Company D |
Sale |
10 |
|
80 |
20.1.2006 |
Company D |
Sale |
10 |
|
34 |
15.1.2006 |
Company AA |
Sale |
100 |
|
80 |
15.1.2006 |
Company AA |
Sale |
30 |
Ako sa teda vyrieši tento hlavolam?
Riešením je vynútiť, aby dotaz predpokladal, že hodnota poľa bude číslo. Môžete to dosiahnuť pomocou tohto výrazu:
IIf(False, 0, Null)
Hodnota podmienky, ktorá sa kontroluje, False (Nepravda), nikdy nebude mať hodnotuTrue (Pravda), pretože výraz vždy vráti hodnotu Null. Access aj napriek tomu vyhodnotí obe možnosti výstupu a rozhodne, či bude výstup číselná hodnota alebo hodnota Null.
Takýmto spôsobom môžeme použiť tento výraz v našom funkčnom príklade:
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;
Všimnite si, že nie je potrebné upraviť druhý dotaz.
Ak prepnete na údajové zobrazenie, zobrazí sa požadovaný výsledok:
Product ID |
Order Date |
Company Name |
Transaction |
Buy |
Sell |
74 |
22.1.2006 |
Supplier B |
Purchase |
20 |
|
77 |
22.1.2006 |
Supplier B |
Purchase |
60 |
|
80 |
22.1.2006 |
Supplier D |
Purchase |
75 |
|
81 |
22.1.2006 |
Supplier A |
Purchase |
125 |
|
81 |
22.1.2006 |
Supplier A |
Purchase |
200 |
|
7 |
20.1.2006 |
Company D |
Sale |
10 |
|
51 |
20.1.2006 |
Company D |
Sale |
10 |
|
80 |
20.1.2006 |
Company D |
Sale |
10 |
|
34 |
15.1.2006 |
Company AA |
Sale |
100 |
|
80 |
15.1.2006 |
Company AA |
Sale |
30 |
Alternatívnou metódou, pomocou ktorej dosiahnete rovnaký výsledok, je vložiť pred dotazy v zjednocovacom dotaze ešte ďalší dotaz:
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
Access pre každé pole vráti pevné hodnoty definovaného typu údajov. Samozrejme, že nechcete, aby výstup tohto dotazu zasahoval do výsledkov, takže trik, ktorému sa vyhnúť, je zahrnúť klauzulu WHERE na hodnotu False:
WHERE False
Ide o malý trik, keďže hodnota bude vždy nepravdivá a dotaz potom nevráti nič. Skombinovaním tohto príkazu s existujúcou syntaxou SQL dosiahneme dokončený príkaz, ako je ten nasledujúci:
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;
Poznámka: Skombinovaný dotaz v tomto príklade s použitím databázy Northwind vracia 100 záznamov, zatiaľ čo dva samostatné dotazy vracajú jednotlivo 58 a 43 záznamov, čo je celkovo 101 záznamov. Tento rozpor vzniká, pretože dva záznamy nie sú jedinečné. Pozrite si časť Práca s rozdielnymi záznamami v zjednocovacích dotazoch s použitím kľúčového slova UNION ALLa zistite, ako vyriešiť tento scenár pomocou kľúčového slova UNION ALL.
Špeciálnym prípadom pri zjednocovacom dotaze je skombinovanie množiny záznamov s jedným záznamom, ktorý obsahuje súčet jedného alebo viacerých polí.
Tento príklad môžete vytvoriť vo vzorovej databáze Northwind na znázornenie toho, ako získať súčet v zjednocovacom dotaze.
-
Ak chcete zobraziť nákup pív (Product ID=34 v databáze Northwind), vytvorte nový jednoduchý dotaz pomocou nasledovnej syntaxe 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];
-
Prepnite na údajové zobrazenie a mali by ste vidieť štyri nákupy:
Date Received
Quantity
22.1.2006
100
22.1.2006
60
4.4.2006
50
5.4.2006
300
-
Ak chcete získať súčet, vytvorte jednoduchý agregačný dotaz pomocou nasledujúcej syntaxe SQL:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))
-
Prepnite na údajové zobrazenie a mali by ste vidieť iba jeden záznam:
MaxOfDate Received
SumOfQuantity
5.4.2006
510
-
Skombinovaním týchto dvoch dotazov v zjednocovacom dotaze pridáte záznam so súčtom množstva k záznamom o nákupe:
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];
-
Prepnite na údajové zobrazenie. Mali by ste vidieť štyri nákupy so súčtom každého nákupu a následne záznam so súčtom množstva:
Date Received
Quantity
22.1.2006
60
22.1.2006
100
4.4.2006
50
5.4.2006
300
5.4.2006
510
Tieto kroky pokrývajú základné informácie o pridávaní súčtov do zjednocovacieho dotazu. Možno budete chcieť zahrnúť do oboch dotazov pevné hodnoty, ako napríklad Detail (Podrobnosti) a Total (Súčet), a tak vizuálne odlíšiť záznam so súčtom od ostatných záznamov. Používanie pevných hodnôt si môžete prezrieť v časti Skombinovanie troch alebo viacerých tabuliek či dotazov v zjednocovacom dotaze.
Zjednocovacie záznamy v Accesse predvolene zahŕňajú iba rozdielne záznamy. Ale čo v prípade, že chcete zahrnúť všetky záznamy? Môže vám pomôcť ďalší príklad.
V predchádzajúcej časti sme vám ukázali, ako vytvoriť súčet v zjednocovacom dotaze. Upravte tento zjednocovací dotaz SQL tak, aby zahŕňal Product ID= 48 (ID Produktu= 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];
Keď prepnete na údajové zobrazenie, zobrazí sa (v istom zmysle) zavádzajúci výsledok:
Date Received |
Quantity |
22.1.2006 |
100 |
22.1.2006 |
200 |
Jeden záznam samozrejme nevracia dvakrát súčet množstva.
Takýto výsledok sa zobrazí preto, lebo v jeden deň sa dvakrát predalo rovnaké množstvo čokolád – ako je to zaznamenané v tabuľke Purchase Order Details (Podrobnosti nákupnej objednávky). Tu je výsledok jednoduchého výberového dotazu zobrazujúci obidva záznamy vzorovej databázy Northwind:
Purchase Order ID |
Product |
Quantity |
100 |
Northwind Traders Chocolate |
100 |
92 |
Northwind Traders Chocolate |
100 |
Môžete vidieť, že v predchádzajúcom zjednocovacom dotaze pole Purchase Order ID (ID nákupnej objednávky) nie je zahrnuté a dané dve polia netvoria dva odlišné záznamy.
Ak chcete zahrnúť všetky záznamy, použite v príkaze SQL namiesto kľúčového slova UNION kľúčové slovo UNION ALL. S najväčšou pravdepodobnosťou to bude mať vplyv na zoradenie výsledkov, takže možno budete chcieť pridať klauzulu ORDER BY na určenie spôsobu zoradenia. Tu je upravená syntax SQL vytvorená na základe predchádzajúceho príkladu:
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];
Prepnite na údajové zobrazenie. Okrem súčtu (ako pri poslednom zázname) by sa mali zobraziť aj všetky podrobnosti:
Date Received |
Total |
Quantity |
22.1.2006 |
100 |
|
22.1.2006 |
100 |
|
22.1.2006 |
Total |
200 |
Zjednocovací dotaz zvykne bežne slúžiť ako zdroj záznamov pre rozbaľovacie pole vo formulári. V takomto rozbaľovacom poli môžete vybrať hodnotu na filtrovanie záznamov formulára. Príkladom môže byť filtrovanie záznamov zamestnancov podľa ich mesta.
Ak chcete vedieť, ako to funguje, tu je ďalší príklad, ktorý môžete vytvoriť vo vzorovej databáze Northwind na znázornenie tohto scenára.
-
Vytvorte jednoduchý výberový dotaz pomocou syntaxe SQL:
SELECT Employees.City, Employees.City AS Filter FROM Employees;
-
Prepnite na údajové zobrazenie. Mali by sa zobraziť nasledujúce výsledky:
City
Filter
Seattle
Seattle
Bellevue
Bellevue
Redmond
Redmond
Kirkland
Kirkland
Seattle
Seattle
Redmond
Redmond
Seattle
Seattle
Redmond
Redmond
Seattle
Seattle
-
Pohľad na tieto výsledky ale pre vás zrejme nemá vysokú hodnotu. Rozbaľte však dotaz a transformujte ho na zjednocovací dotaz použitím nasledujúcej syntaxe SQL:
SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;
-
Prepnite na údajové zobrazenie. Mali by sa zobraziť nasledujúce výsledky:
City
Filter
<All>
*
Bellevue
Bellevue
Kirkland
Kirkland
Redmond
Redmond
Seattle
Seattle
Access vykoná zjednotenie deviatich (predtým zobrazených) záznamov pomocou pevných hodnôt polí <All> a "*".
Keďže táto zjednocovacia klauzula neobsahuje kľúčové slovo UNION ALL, Access vráti len odlišné záznamy, čo znamená, že každé mesto je vrátené len raz s pevnými identickými hodnotami.
-
Teraz, keď je zjednocovací dotaz dokončený a zobrazuje názov každého mesta len raz, pričom obsahuje aj možnosť, ktorá efektívne vyberie všetky mestá, môžete tento dotaz použiť ako zdroj záznamov pre rozbaľovacie pole vo formulári. S použitím tohto konkrétneho príkladu ako modelu by ste mohli vytvoriť rozbaľovacie pole vo formulári, nastaviť tento dotaz ako zdroj záznamov, nastaviť vlastnosť Šírka stĺpca vo Filtri stĺpca na hodnotu 0 (nula), ak ho chcete skryť vizuálne, a potom nastaviť vlastnosť Viazaný stĺpec na hodnotu 1 ako označenie indexu druhého stĺpca. Do vlastnosti Filter samotného formulára môžete potom pridať kód (podobný nasledujúcemu kódu) na aktiváciu filtra formulára pomocou hodnoty toho, čo bolo vybraté v rozbaľovacom poli:
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
Používateľ formulára môže potom filtrovať záznamy formulára pre konkrétny názov mesta alebo vybrať možnosť <All> a vytvoriť zoznam všetkých záznamov pre všetky mestá.