Office
Prihlásenie
Použitie zjednocovacieho dotazu na získanie jedného výsledku z kombinácie viacerých dotazov

Použitie zjednocovacieho dotazu na získanie jedného výsledku z kombinácie viacerých dotazov

Niekedy budete možno chcieť vytvoriť zoznam záznamov z jednej tabuľky alebo dotazu so záznamami z ďalšej alebo ďalších tabuliek a vytvoriť jednu množinu záznamov, tzn. zoznam so všetkými záznamami z dvoch alebo viacerých tabuliek. Na tento účel 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.

Poznámka: Obsah tohto článku sa týka počítačových databáz Accessu. Zjednocovací dotaz nemožno vytvoriť ani používať vo webových databázach ani vo webových aplikáciách Accessu.

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, najskôr sa zobrazí dialógové okno na prihlásenie. Zavrite ho a potom rozbaľte navigačnú tablu. Kliknite na hornú časť navigačnej tably a potom vyberte položku Typ objektu. Všetky objekty databázy sa usporiadajú 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:

Snímka obrazovky s ikonou zjednocovacieho dotazu v Accesse.

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ý návrhár dotazov Accessu nemôže byť použitý na vytvorenie alebo úpravu zjednocovacích dotazov. Zistíte to, ak otvoríte zjednocovací dotaz z navigačnej tably. Access dotaz otvorí a zobrazí výsledky v údajovom zobrazení. Všimnite si, že v časti príkazu Zobrazenia na karte Domov nie je dostupná možnosť Návrhové zobrazenie, keď pracujete so zjednocovacími dotazmi. Pri práci so zjednocovacími dotazmi môžete prepínať iba medzi možnosťami Údajové zobrazenie a Zobrazenie SQL.

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.

Váš prehliadač nepodporuje video. Nainštalujte si Microsoft Silverlight, Adobe Flash Player alebo Internet Explorer 9.

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;

Prvá a tretia časť tohto príkazu SQL sú v podstate dva výberové dotazy. Tieto dotazy načítajú dve odlišné množiny záznamov. Jedna je z tabuľky Product Orders a druhá z tabuľky Product Purchases.

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.

  1. Na karte Vytvoriť kliknite v skupine Dotazy na položku Návrh dotazu.

  2. V dialógovom okne Zobrazenie tabuľky dvakrát kliknite na tabuľku obsahujúcu polia, ktoré chcete zahrnúť. Tabuľka sa pridá do okno návrhu dotazu.

  3. Zavrite dialógové okno Zobrazenie tabuľky.

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

  5. Voliteľne pridajte do polí kritériá zadaním príslušných výrazov do riadka Kritériá v mriežke poľa.

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

  7. Prepnite dotaz do návrhového zobrazenia.

  8. Uložte výberový dotaz a ponechajte ho otvorený.

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

  1. Na karte Vytvoriť kliknite v skupine Dotazy na položku Návrh dotazu.

  2. Zatvorte dialógové okno Zobrazenie tabuľky.

  3. Na karte Návrh v skupine Dotaz kliknite na položku Zjednocovací.Okno návrhu dotazu v Accesse je skryté a zobrazuje sa karta objektu zobrazenia SQL. V tomto bode je karta objektu zobrazenia SQL prázdna.

  4. Kliknite na kartu pre prvý výberový dotaz, ktorý chcete skombinovať v zjednocovacom dotaze.

  5. Na karte Domov kliknite na položky Zobraziť> Zobrazenie SQL.

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

  7. Prilepte príkaz SQL pre výberový dotaz do karty objektu v zobrazení SQL zjednocovacieho dotazu.

  8. Odstráňte bodkočiarku (;) na konci príkazu SQL výberového dotazu.

  9. Stlačením klávesu Enter presuňte kurzor o jeden riadok nadol a do nového riadka zadajte kľúčové slovo UNION.

  10. Kliknite na kartu pre ďalší výberový dotaz, ktorý chcete skombinovať v zjednocovacom dotaze.

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

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

Váš prehliadač nepodporuje video. Nainštalujte si Microsoft Silverlight, Adobe Flash Player alebo Internet Explorer 9.

Kroky potrebné na vytvorenie tohto príkladu:

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

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

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

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

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

Pre každé pole vráti Access pevné hodnoty údajového typu, ktorý ste definovali. Samozrejme, nechcete, aby bol výstup tohto dotazu ovplyvnený výsledkami. Trik, pomocou ktorého sa tomu vyhnete, je, že zahrniete klauzulu WHERE k hodnote False (Nepravda):

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.

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

  3. 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))
  4. Prepnite na údajové zobrazenie a mali by ste vidieť iba jeden záznam:

    MaxOfDate Received

    SumOfQuantity

    5.4.2006

    510

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

  1. Vytvorte jednoduchý výberový dotaz pomocou syntaxe SQL:

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

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

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

Na začiatok stránky

Rozšírte svoje zručnosti práce s balíkom Office
Preskúmať školenie
Buďte medzi prvými, ktorí získajú nové funkcie
Pridajte sa k insiderom pre Office

Boli tieto informácie užitočné?

Ďakujeme za vaše pripomienky!

Ďakujeme vám za pripomienky. Pravdepodobne vám pomôže, ak vás spojíme s pracovníkom podpory pre Office.

×