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

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

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. Ako alias poľa môžete poddotaz použiť v prípade, ak chcete použiť výsledky poddotazu ako pole v hlavnom dotaze.

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

Alias poľa poddotaz môžete použiť na zobrazenie hodnôt, ktoré závisia od iných hodnôt v aktuálnom riadku, ktoré nie je možné bez použitia poddotaz. Napríklad, dajte nám návrat na príklade miesto, kde chcete zobraziť interval medzi objednávky pre každú z vašich produktov. Ak chcete zistiť tento interval, je potrebné porovnať každým dátumom objednávky na iné poradie dátumov pre daný produkt. Môžete vytvoriť dotaz, ktorý zobrazuje tieto informácie pomocou šablóny Northwind 2007.

Zobraziť pokyny na nastavenie Northwind 2007

  1. Kliknite na tlačidlo balíka Microsoft Office Vzhľad tlačidla Office a potom na položku Nový.

  2. Na ľavej table v časti Kategórie šablón, kliknite na položku Miestne šablóny.

  3. V časti Miestne šablóny, kliknite na položku Northwind 2007 a 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. Prejdite na kartu Vytvoriť a v skupine Iné kliknite 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.

  9. 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. Prejdite na kartu Návrh a v skupine Výsledky kliknite na položku Spustiť.

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

    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. Ako kritérium poľa môžete poddotaz použiť v prípade, ak chcete pomocou výsledkov poddotazu obmedziť hodnoty, ktoré sa v poli zobrazia.

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 súbor Northwind 2007.accdb a povoľte jeho obsah.

  2. Zavrite prihlasovací formulár.

  3. Prejdite na kartu Vytvoriť a v skupine Iné 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érium 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.

×