Vnorenie dotazu do iného dotazu alebo do výrazu pomocou poddotazu

Dôležité : Tento článok je strojovo preložený, prečítajte si vyhlásenie. Anglickú verziu tohto článku nájdete tu a môžete ju použiť ako referenciu.

Výsledky určitého dotazu je niekedy potrebné použiť ako pole v inom dotaze alebo ako kritérium pre určité pole dotazu. Predpokladajme napríklad, že chcete zobraziť interval medzi dvoma objednávkami každého z produktov. Ak chcete vytvoriť dotaz na zobrazenie tohto intervalu, je potrebné porovnať každý dátum objednávky s ostatnými dátumami objednávok tohto produktu. Na porovnanie týchto dátumov objednávok je zas potrebný ďalší dotaz. Tento dotaz môžete vnoriť do svojho hlavného dotazu prostredníctvom subquery.

Poddotaz môžete vytvoriť ako expression alebo ako príkaz SQL (Structured Query Language) v SQL view.

Poznámka :  Tento článok sa nevzťahuje na accessové aplikácie – nový druh databázy, ktorý navrhujete pomocou Accessu a publikujete online. Ďalšie informácie nájdete v téme Vytvorenie accessovej aplikácie.

Obsah tohto článku

Použitie výsledkov dotazu ako poľa v inom dotaze

Použitie poddotazu ako kritéria pre pole dotazu

Bežné kľúčové slová SQL, ktoré je možné použiť s poddotazom

Použitie výsledkov dotazu ako poľa v inom dotaze

Poddotaz môžete použiť ako alias poľa. Pomocou poddotazu ako alias poľa, keď chcete použiť poddotaz výsledky ako pole do hlavného dotazu.

Poznámka : Poddotaz, ktorý použijete ako alias poľa, nemôže vrátiť viac ako jedno pole.

Alias poľa poddotazu môžete použiť na zobrazenie hodnôt závislých od iných hodnôt v aktuálnom riadku, čo nie je možné bez použitia poddotazu.

Vráťme sa teda k príkladu, v ktorom ste chceli zobraziť interval medzi objednávkami každého z produktov. Na zistenie tohto intervalu je potrebné porovnať každý dátum objednávky s ostatnými dátumami objednávok pre tento produkt. Dotaz zobrazujúci tieto informácie môžete vytvoriť pomocou šablóny databázy Northwind.

Zobrazenie postupu na nastavenie v databáze Northwind

  1. Na karte Súbor kliknite na položku Nový.

  2. V časti Dostupné šablóny kliknite na položku Vzorové šablóny.

  3. Kliknite na položku Northwind a potom kliknite na položku Vytvoriť.

  4. Postupujte podľa pokynov na strane Northwind Traders (na karte objektu Úvodná obrazovka) a otvorte databázu. Potom zatvorte dialógové okno prihlásenia.

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

  2. V dialógovom okne Zobrazenie tabuľky kliknite na kartu Dotazy a potom dvakrát kliknite na položku Objednávky produktu.

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

  4. Dvojitým kliknutím na položku Identifikácia produktu a potom na položku Dátum objednávky pridajte obe položky do mriežky návrhu dotazu.

  5. V riadku Zoradenie stĺpca Identifikácia produktu mriežky vyberte možnosť Vzostupne.

  6. V riadku Zoradenie stĺpca Dátum objednávky mriežky vyberte možnosť Zostupne.

  7. V treťom stĺpci mriežky kliknite pravým tlačidlom na riadok Pole a potom v kontextovej ponuke kliknite na položku Lupa.

  8. Do dialógového okna Lupa zadajte alebo prilepte nasledujúci výraz:

    Prior Date: (SELECT MAX([Order Date]) 
    FROM [Product Orders] AS [Old Orders]
    WHERE [Old Orders].[Order Date] < [Product Orders].[Order Date]
    AND [Old Orders].[Product ID] = [Product Orders].[Product ID])

Tento výraz je poddotaz. Pre každý riadok tento poddotaz vyberie najnovší dátum objednávky, ktorý nie je neskorší ako dátum objednávky, ktorý je aktuálne priradený k riadku. Všimnite si, ako môžete použiť kľúčové slovo AS na vytvorenie aliasu tabuľky, aby ste mohli porovnať hodnoty v poddotaze s hodnotami v aktuálnom riadku hlavného dotazu.

  1. Vo štvrtom stĺpci mriežky prejdite do riadka Pole a zadajte nasledujúci výraz:

    Interval: [Order Date]-[Prior Date]

Tento výraz vypočíta interval medzi každým dátumom objednávky a predchádzajúcim dátumom objednávky pre tento produkt, pričom použije hodnotu pre predchádzajúci dátum, ktorý sme definovali pomocou poddotazu.

  1. Na karte Návrh kliknite v skupine Výsledky na položku Spustiť.

    1. Dotaz sa spustí a zobrazí zoznam názvov produktov, dátumov objednávok, predchádzajúcich dátumov objednávok a interval medzi dátumami objednávok. Výsledky sú zoradené podľa identifikácie produktu (vo vzostupnom poradí) a potom podľa dátumu objednávky (v zostupnom poradí).

    2. Poznámka : Keďže pole Identifikácia produktu je vyhľadávacie pole, v programe Access sa namiesto skutočných identifikácií produktov zobrazia vyhľadané hodnoty (v tomto prípade to budú názvy produktov). Takto sa síce zmenia zobrazované hodnoty, ale poradie zoradenia sa nemení.

  2. Zatvorte databázu Northwind.

Na začiatok stránky

Použitie poddotazu ako kritéria pre pole dotazu

Poddotaz môžete použiť ako kritérium poľa. Ak chcete použiť výsledky poddotaz na obmedzenie hodnoty, ktoré v poli sa zobrazuje, ako kritérium poľa pomocou poddotazu.

Predpokladajme napríklad, že chcete skontrolovať zoznam objednávok spracovaných zamestnancami, ktorí nie sú obchodnými zástupcami. Ak chcete generovať tento zoznam, je potrebné porovnať identifikáciu zamestnanca pre každú objednávku so zoznamom identifikácií zamestnancov, ktorí nie sú obchodnými zástupcami. Ak chcete vytvoriť tento zoznam a použiť ho ako kritérium poľa, použite poddotaz tak, ako je to znázornené v nasledujúcom postupe:

  1. Otvorte databázu Northwind a povoľte jej obsah.

  2. Zavrite prihlasovací formulár.

  3. Prejdite na kartu Vytvoriť a v skupine Dotazy kliknite na položku Návrh dotazu.

  4. V dialógovom okne Zobrazenie tabuľky na karte Tabuľky dvakrát kliknite na tabuľky Objednávky a Zamestnanci

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

  6. V tabuľke Objednávky dvojitým kliknutím na pole Identifikácia zamestnanca, pole Identifikácia objednávky a pole Dátum objednávky pridajte tieto polia do mriežky návrhu dotazu. V tabuľke Zamestnanci dvojitým kliknutím na pole Funkcia pridajte toto pole do mriežky návrhu.

  7. Kliknite pravým tlačidlom myši na riadok Kritériá stĺpca Identifikácia zamestnanca a potom v kontextovej ponuke kliknite na položku Lupa.

  8. Do poľa Lupa zadajte alebo prilepte nasledujúci výraz:

    IN (SELECT [ID] FROM [Employees] 
    WHERE [Job Title]<>'Sales Representative')

    Toto je poddotaz. Vyberie identifikácie všetkých zamestnancov, ktorí nepracujú na pozícii obchodného zástupcu, a získanú množinu výsledkov odosiela do hlavného dotazu. Hlavný dotaz potom skontroluje, či sa identifikácie zamestnancov z tabuľky Objednávky nachádzajú v množine výsledkov.

  9. Prejdite na kartu Návrh a v skupine Výsledky kliknite na položku Spustiť.

    Dotaz sa spúšťa a vo výsledkoch dotazu sa zobrazí zoznam objednávok spracovaných zamestnancami, ktorí nie sú obchodnými zástupcami.

Na začiatok stránky

Bežné kľúčové slová SQL, ktoré je možné použiť s poddotazom

Existuje niekoľko kľúčových slov SQL, ktoré môžete použiť s poddotazom:

Poznámka : Tento zoznam nie je úplný. V poddotaze môžete použiť ľubovoľné platné kľúčové slovo okrem kľúčových slov definujúcich údaje.

  • ALL    Použitím kľúčového slova ALL v klauzule WHERE môžete vyhľadať riadky vyhovujúce určitej podmienke pri porovnaní s každým riadkom, ktorý vráti poddotaz.

    Predpokladajme napríklad, že analyzujete údaje študentov v ročníku. Študenti musia splniť minimálne kritériá, ktoré sú pre každú špecializáciu iné. Špecializácie a minimálne kritériá sú uložené v tabuľke s názvom Špecializácie a zodpovedajúce informácie o študentoch sú uložené v tabuľke s názvom Záznamy_študentov.

    Ak chcete zobraziť zoznam špecializácií (a ich minimálnych kritérií), pre ktoré každý študent s danou špecializáciou prekračuje minimálne kritériá, môžete použiť nasledujúci dotaz:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] < ALL
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);
  • ANY    Použitím kľúčového slova ANY v klauzule WHERE môžete vyhľadať riadky vyhovujúce určitej podmienke pri porovnaní s aspoň jedným z riadkov, ktoré vráti poddotaz.

    Predpokladajme napríklad, že analyzujete údaje študentov v ročníku. Študenti musia splniť minimálne kritériá, ktoré sú pre každú špecializáciu iné. Špecializácie a minimálne kritériá sú uložené v tabuľke s názvom Špecializácie a zodpovedajúce informácie o študentoch sú uložené v tabuľke s názvom Záznamy_študentov.

    Ak chcete zobraziť zoznam špecializácií (a ich minimálnych kritérií), pre ktoré ľubovoľný študent s danou špecializáciou neprekračuje minimálne kritériá, môžete použiť nasledujúci dotaz:

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] > ANY
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);

    Poznámka : Na ten istý účel môžete použiť aj kľúčové slovo SOME. Kľúčové slovo SOME je synonymom kľúčového slova ANY.

  • EXISTS    Pomocou kľúčového slova EXISTS v klauzule WHERE môžete uviesť, že poddotaz by mal vrátiť aspoň jeden riadok. Pred kľúčové slovo EXISTS tiež môžete pridať výraz NOT a uviesť tak, že poddotaz by nemal vrátiť žiadne riadky.

    Nasledujúci dotaz napríklad vráti zoznam produktov, ktoré sa nachádzajú v aspoň jednej existujúcej objednávke:

    SELECT *
    FROM [Products]
    WHERE EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);

    Ak použijete kľúčové slová NOT EXISTS, dotaz vráti zoznam produktov, ktoré sa nenachádzajú v aspoň jednej existujúcej objednávke:

    SELECT *
    FROM [Products]
    WHERE NOT EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);
  • IN    Pomocou kľúčového slova IN v klauzule WHERE môžete zabezpečiť, aby hodnota v aktuálnom riadku hlavného dotazu bola súčasťou množiny, ktorú poddotaz vráti. Pred kľúčové slovo IN môžete vložiť kľúčové slovo NOT, ktoré zabezpečí, aby hodnota v aktuálnom riadku hlavného dotazu nebola súčasťou množiny, ktorú poddotaz vráti.

    Napríklad nasledujúci dotaz vráti zoznam objednávok (s dátumami objednávok), ktoré boli spracované inými zamestnancami, než sú obchodní zástupcovia:

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]<>'Sales Representative');

    Ak použijete kľúčové slová NOT IN, môžete ten istý dotaz zadať nasledujúcim spôsobom:

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] NOT IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]='Sales Representative');

Na začiatok stránky

Poznámka : Vyhlásenie týkajúce sa strojového prekladu: Tento článok bol preložený počítačovým systémom bez zásahu človeka. Poskytovaním týchto strojových prekladov umožňuje spoločnosť Microsoft aj používateľom, ktorí nehovoria po anglicky, využívať obsah o produktoch, službách a technológiách spoločnosti Microsoft. Článok bol preložený strojovo, môže preto obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky.

Rozšírte svoje zručnosti
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.

×