Niekedy možno budete chcieť skombinovať záznamy z jednej tabuľky alebo dotazu so záznamami z ďalšej alebo viacerých tabuliek do jedného výsledku. Na to slúži zjednocovací dotaz 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, môže byť užitočné najskôr si preštudovať 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 výberom položky Súbor,>Nové. Môžete si tiež stiahnuť kópiu priamo zo vzorovej šablóny databázy Northwind.
Keď Access otvorí databázu Northwind, najskôr sa zobrazí dialógové okno prihlásenia a potom rozbaľte navigačnú tablu. Vyberte hornú časť navigačnej tably a potom položku Typ objektu , čím usporiadate všetky databázové objekty podľa typu. Následne rozbaľte skupinu Dotazy . Zobrazí sa dotaz s názvom Product Transactions.
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 nie sú spojené v zjednocovacom dotaze. To znamená, že grafického návrhára dotazov programu Access nemožno použiť na vytvorenie alebo úpravu zjednocovacích dotazov. Ak otvoríte zjednocovací dotaz z navigačnej tably, Access ho otvorí a zobrazí výsledky v údajovom zobrazení. Všimnite si, že v časti Zobrazenia na karte Domov nie je návrhové zobrazenie k dispozícii, keď pracujete so zjednocovacími dotazmi. Prepínať môžete len medzi údajovým zobrazením a zobrazením SQL.
Ak chcete pokračovať v študovaní tohto príkladu zjednocovacieho dotazu, kliknite na položkuZobrazenia>Domov>SQL Zobrazenie a zobrazí sa syntax, SQL ktorá ho definuje. Do tohto SQL znázornenia sme pridali medzery navyše, aby ste mohli jednoducho odlíšiť jednotlivé časti, ktoré tvoria zjednocovací dotaz.
Pozrime sa podrobne SQL na syntax 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;
Prvá a tretia časť tohto príkazu SQL sú v podstate dva výberové dotazy. Tieto dotazy načítajú dve rôzne množiny záznamov. jednu z tabuľky Objednávky produktov a jednu z tabuľky Nákupy produktov .
Druhá časť tohto SQL príkazu UNION je kľúčové slovo, ktoré informuje Access o tom, aby tieto dve množiny záznamov skombinoval.
Posledná časť tohto SQL príkazu 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ť napísaním syntaxe SQL priamo v zobrazení 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ť.
Po vytvorení výberových dotazov ich môžete skombinovať. 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 Zjednocovať. Okno návrhu dotazu v Accesse sa skryje a zobrazí sa karta objektu zobrazenia SQL . V tomto bode je karta prázdna.
- Kliknite na kartu pre prvý výberový dotaz, ktorý chcete skombinovať v zjednocovacom dotaze.
- Na karte Domov kliknite na položku Zobraziť>zobrazenie SQL.
- Skopírujte
SQLpríkaz pre výberový dotaz. Kliknite na kartu pre zjednocovací dotaz, ktorý ste začali vytvárať v predchádzajúcom kroku. - Prilepte
SQLpríkaz pre výberový dotaz na kartu objektu zobrazenia SQL zjednocovacieho dotazu. - Odstráňte bodkočiarku (
;) na konci príkazu dotazuSQLSelect. - Stlačením klávesu Enter presuňte kurzor o jeden riadok nadol a potom zadajte text
UNIONdo nového riadka. - 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
SQLpre výberové dotazy do okna zobrazenia SQL zjednocovacieho dotazu. Neodstraňujte bodkočiarku ani nezadávajte nič za príkaz pre posledný výberovýSQLdotaz. - 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 pridajte 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
ORDER BYpríkaz do zjednocovacieho dotazu v zobrazení SQL. 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ý príklad
SQL, v ktorom sa skombinujú a zoradia názvy pre tento príklad zjednocovacieho dotazu, je nasledujúci: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 SQL syntaxe, môžete vytvoriť vlastný SQL príkaz pre zjednocovací dotaz priamo v zobrazení 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.
Skombinovanie troch alebo viacerých tabuliek či dotazov v zjednocovacom dotaze
V predchádzajúcej časti sú v príklade používajúcom databázu 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 sa v poli zobrazovalo, či je osoba interným zamestnancom (in-house) alebo patrí medzi dodávateľov (supplier) či zákazníkov (customer), môžete namiesto názvu spoločnosti vložiť pevnú hodnotu . Vyzerá to SQL 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 je možné znížiť ešte viac, pretože Access prečíta názvy výstupných polí len z prvého dotazu v zjednocovacom dotaze. Tu sa odstráni výstup z druhej a tretej časti 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];
Filtrovanie v zjednocovacích dotazoch
V zjednocovacom dotaze Accessu je možné použiť zoradenie iba raz, ale každý z dotazov môžete filtrovať samostatne. V nadväznosti na zjednocovací dotaz z predchádzajúcej časti je tu uvedený príklad, v ktorom sa každý dotaz filtruje 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 |
Miešanie typov údajov
Ak sú zjednocované dotazy 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 rozdeliť pole Množstvo na dve polia: Nákup a Predaj. Povedzme tiež, že chcete mať pevnú nulovú hodnotu pre pole bez hodnoty. Takto vyzerá zjednocovací SQL 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 nulovými hodnotami majú byť prázdne? Pridaním kľúčového Null slova môžete upraviť zobrazenie SQL prázdneho slova namiesto nuly, ako je znázornené tu:
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 môže vyzerať SQL takto:
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?
Jedným z riešení je vynútiť, aby dotaz predpokladal, že hodnota poľa bude číslo. Môžete tak urobiť pomocou tohto výrazu:
IIf(False, 0, Null)
Podmienka na kontrolu Falseje nikdy True, takže výraz vždy vráti .Null Access však naďalej vyhodnocuje obidve možnosti výstupu a zaobchádza s výstupom ako s číselným alebo 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;
Druhý dotaz nie je potrebné upraviť.
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
Pre každé pole vráti Access pevné hodnoty údajového typu, ktorý definujete. Samozrejme, nechcete, aby bol výstup tohto dotazu ovplyvnený výsledkami. Trik, pomocou ktorého sa tomu vyhnete, je zahrnúť klauzulu WHERE k hodnote False:
WHERE False
To je malý trik. Keďže podmienka je vždy nepravdivá, dotaz 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
V tomto príklade kombinovaný dotaz v databáze Northwind vracia 100 záznamov, zatiaľ čo dva samostatné dotazy vracajú jednotlivo 58 a 43 záznamov, čo je celkovo 101 záznamov. Tento rozdiel sa vyskytuje, pretože dva záznamy nie sú jedinečné. Pozrite si tému Práca s odlišnými záznamami v zjednocovacích dotazoch pomocou funkcie UNION ALL a zistite, ako tento scenár vyriešiť pomocou UNION ALL.
Pridanie súčtov do zjednocovacieho dotazu
Zjednocovací dotaz má špeciálne použitie na 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.
Práca s rozdielnymi záznamami v zjednocovacích dotazoch s použitím kľúčového slova UNION ALL
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 zjednocovací dotaz SQL tak, aby zahŕňal 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];
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 |
Samozrejme, jeden záznam nevracia dvojnásobok celkového množstva.
Tento výsledok sa zobrazí, pretože 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 UNION ALL namiesto vzorca .SQLUNION Pravdepodobne to ovplyvní zoradenie výsledkov, takže možno budete chcieť pridať klauzulu ORDER BY na určenie spôsobu zoradenia. Tu je úprava SQL 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 |
Použitie zjednocovacieho dotazu na filtrovanie záznamov vo formulári prostredníctvom rozbaľovacieho poľa
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 tejto
SQLsyntaxe: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 zmeňte ho na zjednocovací dotaz pomocou
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 <Všetky> * 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
UNION ALL, Access vráti len odlišné záznamy. To znamená, že každé mesto sa vráti 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
Filtervlastnosti samotného formulára môžete potom pridať kód ako je uvedený nižšie na aktiváciu filtra formulára pomocou hodnoty vybratej v rozbaľovacom poli:Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = TruePoužívateľ formulára môže potom filtrovať záznamy formulára pre konkrétny názov mesta alebo vybrať položku <Všetko> a vytvoriť zoznam všetkých záznamov pre všetky mestá.