Poddotaz je príkaz SELECT vnorený vo vnútri príkazu SELECT, SELECT... DO, VLOŽIŤ... Príkaz INTO, DELETE alebo UPDATE alebo v inom poddotaze.
Syntax
Poddotaz môžete vytvoriť pomocou troch foriem syntaxe:
porovnanie [ANY | VŠETKY | NIEKTORÉ] (sqlstatement)
výraz [NOT] IN (sqlstatement)
[NOT] EXISTS (sqlstatement)
Poddotaz má tieto časti:
Časť |
Popis |
Porovnanie |
výraz a operátor porovnania, ktorý porovnáva výraz s výsledkami poddotazu. |
výraz |
Výraz, pre ktorý sa prehľadáva množina výsledkov poddotazu. |
príkaz SQL |
Príkaz SELECT, ktorý má rovnaký formát a pravidlá ako akýkoľvek iný príkaz SELECT. Musí byť uzavretá v zátvorkách. |
Poznámky
Namiesto výrazu v zozname polí príkazu SELECT alebo klauzuly WHERE alebo HAVING môžete použiť poddotaz. V poddotazi použijete príkaz SELECT na poskytnutie množiny jednej alebo viacerých konkrétnych hodnôt na vyhodnotenie vo výraze klauzuly WHERE alebo HAVING.
Pomocou predikátu ANY alebo SOME, ktoré sú synonymické, môžete načítať záznamy v hlavnom dotaze, ktoré spĺňajú porovnanie so všetkými záznamami načítanými v poddotazi. V nasledujúcom príklade sa vrátia všetky produkty, ktorých jednotková cena je väčšia ako cena akéhokoľvek produktu predaného so zľavou 25 percent alebo viac:
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
Predikát ALL sa používa na načítanie iba tých záznamov v hlavnom dotaze, ktoré spĺňajú porovnanie so všetkými záznamami načítanými v poddotaze. Ak ste v predchádzajúcom príklade zmenili možnosť ANY na ALL, dotaz vráti iba produkty, ktorých jednotková cena je väčšia ako cena všetkých produktov predaných so zľavou 25 percent alebo viac. Je to oveľa prísnejšie.
Predikát IN sa používa na načítanie iba tých záznamov v hlavnom dotaze, pre ktoré niektoré záznamy v poddotazi obsahujú rovnakú hodnotu. V nasledujúcom príklade sa vrátia všetky produkty so zľavou 25 % alebo viac:
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
Naopak, funkciu NOT IN môžete použiť na načítanie iba tých záznamov v hlavnom dotaze, pre ktoré žiadny záznam v poddotaze neobsahuje rovnakú hodnotu.
Použite predikát EXISTS (s voliteľným nevyhradeným slovom NOT) v porovnaniach true/false na určenie, či poddotaz vráti nejaké záznamy.
Aliasy názvov tabuliek môžete v poddotazi použiť aj na odkazovanie na tabuľky uvedené v klauzule FROM mimo poddotaz. V nasledujúcom príklade sa vrátia mená zamestnancov, ktorých platy sa rovnajú alebo sú vyššie ako priemerná mzda všetkých zamestnancov s rovnakým pracovným zaradeniom. Tabuľka Zamestnanci má alias "T1":
SELECT LastName, FirstName, Title, Salary FROM Employees AS T1 WHERE Salary >= (SELECT Avg(Salary) FROM Employees WHERE T1.Title = Employees.Title) Order by Title;
V predchádzajúcom príklade je vyhradené slovo AS voliteľná.
Niektoré poddotazy sú povolené v krížových dotazoch – konkrétne ako predikáty (tie v klauzule WHERE). Poddotazy ako výstup (tie v zozname SELECT) nie sú povolené v krížových dotazoch.