Poddotaz je příkaz SELECT vnořený do objektu SELECT, SELECT... INTO, INSERT... PŘÍKAZ INTO, DELETE nebo UPDATE nebo uvnitř jiného poddotazu.
Syntaxe
K vytvoření poddotazu můžete použít tři formy syntaxe:
porovnání [ANY | ALL | SOME] (sqlstatement)
expression [NOT] IN (sqlstatement)
[NE] EXISTS (sqlstatement)
Poddotaz má tyto části:
Část |
Popis |
Porovnání |
Výraz a operátor porovnání, který porovnává výraz s výsledky poddotazu. |
Výraz |
Výraz, pro který se hledá sada výsledků poddotazu. |
sqlstatement |
Příkaz SELECT, který má stejný formát a pravidla jako jakýkoli jiný příkaz SELECT. Musí být uzavřen v závorkách. |
Poznámky
Poddotaz můžete použít místo výrazu v seznamu polí příkazu SELECT nebo v klauzuli WHERE nebo HAVING. V poddotazu použijete příkaz SELECT k zadání sady jedné nebo více konkrétních hodnot, které se mají vyhodnotit ve výrazu klauzule WHERE nebo HAVING.
K načtení záznamů v hlavním dotazu, které vyhovují porovnání se všemi záznamy načtenými v poddotazu, použijte predikát ANY nebo SOME, které jsou synonymní. Následující příklad vrátí všechny produkty, jejichž jednotková cena je vyšší než cena jakéhokoli produktu prodaného se slevou 25 procent nebo vyšší:
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
Predikát ALL použijte k načtení pouze těch záznamů v hlavním dotazu, které splňují porovnání se všemi záznamy načtenými v poddotazu. Pokud jste v předchozím příkladu změnili hodnotu ANY na ALL, dotaz by vrátil pouze produkty, jejichž jednotková cena je vyšší než cena všech produktů prodaných se slevou 25 procent nebo vyšší. To je mnohem restriktivnější.
Predikát IN použijte k načtení pouze těch záznamů v hlavním dotazu, pro které některý záznam v poddotazu obsahuje stejnou hodnotu. Následující příklad vrátí všechny produkty se slevou 25 procent nebo vyšší:
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
Naopak funkci NOT IN můžete použít k načtení pouze těch záznamů v hlavním dotazu, pro které žádný záznam v poddotazu neobsahuje stejnou hodnotu.
Pomocí predikátu EXISTS (s volitelným slovem NOT reserved) v porovnání pravda/nepravda určete, jestli poddotaz vrací nějaké záznamy.
Aliasy názvů tabulek můžete také použít v poddotazu k odkazování na tabulky uvedené v klauzuli FROM mimo poddotaz. Následující příklad vrátí jména zaměstnanců, jejichž platy jsou stejné nebo vyšší než průměrná mzda všech zaměstnanců se stejnou pracovní pozici. V tabulce Employees (Zaměstnanci) je přiřazen 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 předchozím příkladu je Rezervované slovo AS nepovinný.
Některé poddotazy jsou v křížových dotazech povolené – konkrétně jako predikáty (ty v klauzuli WHERE). Poddotazy jako výstup (ty v seznamu SELECT) nejsou v křížových dotazech povolené.