Vnoření dotazu do jiného dotazu nebo výrazu pomocí poddotazu

V některých případech může být vhodné použít výsledky dotazu jako pole v jiném dotazu nebo jako kritérium pole dotazu. Předpokládejme například, že chcete zjistit interval mezi objednávkami na jednotlivé výrobky. Abyste mohli vytvořit dotaz umožňující tento interval zjistit, bude nutné porovnat data jednotlivých objednávek s ostatními daty objednávek na daný výrobek. K porovnání těchto dat objednávek je také nutné použít dotaz. Tento dotaz můžete vnořit do svého hlavního dotazu pomocí subquery.

Poddotaz můžete napsat v podobě expression nebo v podobě příkazu SQL (Structured Query Language) v SQL view.

V tomto článku

Použití výsledků dotazu jako pole pro jiný dotaz

Použití poddotazu jako kritéria pro pole dotazu

Běžná klíčová slova SQL, která lze pro poddotazy používat

Použití výsledků dotazu jako pole pro jiný dotaz

Pokud chcete výsledky poddotazu použít jako pole v hlavním dotazu, můžete poddotaz použít jako alias (SQL) pole.

Poznámka : Poddotaz, který použijete jako alias pole, může vrátit maximálně jedno pole.

Pomocí aliasu pole poddotazu můžete zobrazit hodnoty, které jsou závislé na jiných hodnotách v aktuálním řádku, což není možné bez použití poddotazu.

Vraťme se například k příkladu, kdy budete chtít zjistit interval mezi objednávkami pro jednotlivé výrobky. Aby ho bylo možné zjistit, bude nutné porovnat datum každé objednávky s daty ostatních objednávek na daný výrobek. Dotaz, který tyto informace zobrazí, můžete vytvořit pomocí šablony databáze Northwind.

Ukázat nastavení databáze Northwind

  1. Na kartě Soubor klikněte na položku Nový.

  2. V části Dostupné šablony klikněte na možnost Ukázkové šablony.

  3. Klikněte na možnost Northwind a potom na tlačítko Vytvořit.

  4. Podle pokynů na stránce Northwind Traders (na kartě objektu Úvodní obrazovka) otevřete databázi a potom zavřete přihlašovací dialogové okno.

  1. Na kartě Vytvoření klikněte ve skupině Dotazy na tlačítko Návrh dotazu.

  2. V dialogovém okně Zobrazit tabulku klikněte na kartu Dotazy a potom dvakrát klikněte na možnost Objednávky výrobků.

  3. Zavřete dialogové okno Zobrazit tabulku.

  4. Dvojitým kliknutím přidejte pole Kód výrobku a Datum obj do návrhové mřížky dotazu.

  5. V řádku Řadit sloupce Kód výrobku mřížky vyberte možnost Vzestupně.

  6. V řádku Řadit sloupce Datum obj mřížky vyberte možnost Sestupně.

  7. Ve třetím sloupci mřížky klikněte pravým tlačítkem myši na řádek Pole a potom v místní nabídce klikněte na příkaz Lupa.

  8. V dialogovém okně Lupa zadejte nebo vložte následující výraz:

    Předchozí datum: (SELECT MAX([Datum obj]) 
    FROM [Objednávky výrobků] AS [Staré objednávky]
    WHERE [Staré objednávky].[Datum obj] < [Objednávky výrobků].[Datum obj]
    AND [Staré objednávky].[Kód výrobku] = [Objednávky výrobků].[Kód výrobku])

Tento výraz je poddotaz. Pro každý řádek vybere poddotaz nejaktuálnější datum objednávky, které je starší než datum objednávky již přidružené k řádku. Všimněte si, jakým způsobem se pomocí klíčového slova AS vytváří alias tabulky, abyste mohli porovnávat hodnoty v poddotazu s hodnotami v aktuálním řádku hlavního dotazu.

  1. Ve čtvrtém sloupci mřížky zadejte do řádku Pole následující výraz:

    Interval: [Datum obj]-[Předchozí datum]

Tento výraz vypočítá interval mezi datem každé objednávky a předchozím datem objednávky pro daný výrobek pomocí hodnoty pro předchozí datum, která byla definována pomocí poddotazu.

  1. Na kartě Návrh klikněte ve skupině Výsledky na tlačítko Spustit.

    1. Dotaz je spuštěn a zobrazí seznam názvů výrobků, data objednávek, data předchozích objednávek a interval mezi daty objednávek. Výsledky jsou seřazeny nejprve podle kódu výrobku (ve vzestupném pořadí) a následně podle data objednávky (v sestupném pořadí).

    2. Poznámka : Vzhledem k tomu, že Kód výrobku je vyhledávací pole, zobrazí aplikace Access ve výchozím nastavení místo skutečných kódů výrobků vyhledávací hodnoty (v tomto případě název výrobku). Přestože se tím změní zobrazované hodnoty, nezmění se pořadí řazení.

  2. Zavřete databázi Northwind.

Začátek stránky

Použití poddotazu jako kritéria pro pole dotazu

Poddotaz můžete použít jako criteria pole, a to v případě, že chcete použít výsledky poddotazu k omezení hodnot, které se v daném poli zobrazí.

Předpokládejme například, že chcete zkontrolovat seznam objednávek zpracovaných zaměstnanci, kteří nejsou obchodní zástupci. Abyste mohli tento seznam vygenerovat, je nutné porovnat kód zaměstnance pro každou objednávku se seznamem kódů zaměstnanců, kteří nejsou obchodní zástupci. Budete-li chtít tento seznam vytvořit a použít jej jako kritérium pole, použijete poddotaz (jak je vidět z následujícího postupu):

  1. Otevřete databázi Northwind 2007.accdb a povolte její obsah.

  2. Zavřete formulář pro přihlášení.

  3. Na kartě Vložení klikněte ve skupině Jiné na položku Návrh dotazu.

  4. V dialogovém okně Zobrazit tabulku dvakrát klikněte na kartě Tabulky na položku Objednávky a Zaměstnanci.

  5. Zavřete dialogové okno Zobrazit tabulku.

  6. V tabulce Objednávky klikněte dvakrát na pole Kód, Kód objednávky a nakonec na pole Datum obj. Tím je přidáte do návrhové mřížky dotazu. Dvojitým kliknutím v tabulce Zaměstnanci přidejte do návrhové mřížky pole Funkce.

  7. Klikněte pravým tlačítkem na řádek Kritéria ve sloupci Kód a následně v místní nabídce klikněte na příkaz Lupa.

  8. V dialogovém okně Lupa zadejte nebo vložte následující výraz:

    IN (SELECT [Kód] FROM [Zaměstnanci] 
    WHERE [Funkce]<>'Obchodní zástupce')

    Toto je poddotaz. Vybere všechny kódy zaměstnanců, kteří nemají funkci Obchodní zástupce, a předá tuto výslednou sadu dotazu do hlavního dotazu. Hlavní dotaz následně zkontroluje, zda výsledná sada dotazu obsahuje kódy zaměstnanců z tabulky Objednávky.

  9. Na kartě Návrh klikněte ve skupině Výsledky na tlačítko Spustit.

    Dotaz je spuštěn a ve výsledcích dotazu se zobrazí seznam objednávek zpracovaných zaměstnanci, kteří nejsou obchodní zástupci.

Začátek stránky

Běžná klíčová slova SQL, která lze pro poddotazy používat

S poddotazy lze používat několik klíčových slov SQL:

Poznámka : Nejde o vyčerpávající seznam. V poddotazech můžete používat všechna platná klíčová slova s výjimkou definičních klíčových slov.

  • ALL    Klíčové slovo ALL můžete použít v klauzuli WHERE k načtení řádků, které odpovídají podmínce při porovnání s každým řádkem vráceným poddotazem.

Předpokládejme například, že byste analyzovali data studentů na vysoké škole. Studenti si musí udržovat minimální průměrné hodnocení (výsledek GPA), které se u jednotlivých oborů liší. Obory a jejich minimální průměrná hodnocení GPA jsou uloženy v tabulce s názvem Obory a relevantní informace o studentech v tabulce s názvem Záznamy_studentů.

Pokud byste chtěli zobrazit seznam oborů (a jejich minimální průměrná hodnocení GPA), kde mají všichni studenti studující tento obor vyšší než minimální výsledek GPA, mohli byste použít následující dotaz:

SELECT [Obor], [Min_GPA] 
FROM [Obory]
WHERE [Min_GPA] < ALL
(SELECT [GPA] FROM [Záznamy_studentů]
WHERE [Záznamy_studentů].[Obor]=[Obory].[Obor]);
  • ANY    Klíčové slovo ANY lze použít klauzuli WHERE k načtení řádků odpovídajících podmínce při porovnání s minimálně jedním řádkem vráceným poddotazem.

    Předpokládejme například, že byste analyzovali data studentů na vysoké škole. Studenti si musí udržovat minimální průměrné hodnocení (výsledek GPA), které se u jednotlivých oborů liší. Obory a jejich minimální průměrná hodnocení GPA jsou uloženy v tabulce s názvem Obory a relevantní informace o studentech v tabulce s názvem Záznamy_studentů.

    Pokud byste chtěli zobrazit seznam oborů (a jejich minimální průměrná hodnocení GPA), kde některý student studující tento obor nedosahuje minimálního hodnocení GPA, mohli byste použít následující dotaz:

    SELECT [Obor], [Min_GPA] 
    FROM [Obory]
    WHERE [Min_GPA] > ANY
    (SELECT [GPA] FROM [Záznamy_studentů]
    WHERE [Záznamy_studentů].[Obor]=[Obory].[Obor]);

    Poznámka : Ke stejným účelům můžete také použít klíčové slovo SOME. Jde o synonymum ke klíčovému slovu ANY.

  • EXISTS    Použitím klíčového slova EXISTS v klauzuli WHERE můžete uvést, že má poddotaz vrátit minimálně jeden řádek. Můžete před ním také uvést klíčové slovo NOT, které označuje, že by poddotaz neměl vrátit žádné řádky.

    Například následující dotaz vrátí seznam výrobků, které se nacházejí minimálně v jedné existující objednávce:

    SELECT *
    FROM [Výrobky]
    WHERE EXISTS
    (SELECT * FROM [Podrobnosti objednávky]
    WHERE [Podrobnosti objednávky].[Kód výrobku]=[Výrobky].[Kód]);

    Pokud použijete klíčová slova NOT EXISTS, vrátí dotaz seznam výrobků, které nebyly nalezeny ani v jedné existující objednávce:

    SELECT *
    FROM [Výrobky]
    WHERE NOT EXISTS
    (SELECT * FROM [Podrobnosti objednávky]
    WHERE [Podrobnosti objednávky].[Kód výrobku]=[Výrobky].[Kód]);
  • IN    Pomocí klíčového slova IN v klauzuli WHERE můžete ověřit, že je hodnota v aktuálním řádku hlavního dotazu součástí sady výsledků dotazu, kterou poddotaz vrací. Můžete před ním také použít klíčové slovo NOT. Tímto způsobem lze ověřit, že hodnota v aktuálním řádku hlavního dotazu není součástí sady výsledků dotazu, kterou vrací poddotaz.

    Například následující dotaz vrací seznam objednávek (s daty objednávek) zpracovaných zaměstnanci, kteří nejsou obchodní zástupci:

    SELECT [Kód objednávky], [Datum obj]
    FROM [Objednávky]
    WHERE [Kód] IN
    (SELECT [Kód] FROM [Zaměstnanci]
    WHERE [Funkce]<>'Obchodní zástupce')

    Při použití klíčového slova NOT IN byste však mohli stejný dotaz zapsat tímto způsobem:

    SELECT [Kód objednávky], [Datum obj]
    FROM [Objednávky]
    WHERE [Kód] NOT IN
    (SELECT [Kód] FROM [Zaměstnanci]
    WHERE [Funkce]='Obchodní zástupce');

Začátek stránky

Rozšiřte své znalosti a dovednosti
Projít školení
Získejte nové funkce jako první
Připojte se k účastníkům programu Office Insiders

Byly tyto informace užitečné?

Děkujeme vám za zpětnou vazbu.

Děkujeme vám za váš názor. Vypadá to, že bude užitečné, když vás spojíme s některým z našich agentů z podpory Office.

×