Podpoizvedba je izjava SELECT, ugnezdena znotraj izjave SELECT, SELECT ... INTO, INSERT ... IZJAVA INTO, DELETE ali UPDATE ali v drugi podpoizvedbah.
Sintaksa
Podpoizvedbo lahko ustvarite s tremi oblikami sintakse:
primerjava [ANY | VSE | NEKAJ] (sqlstatement)
izraz [NOT] IN (sqlstatement)
[NOT] EXISTS (sqlstatement)
Podpoizvedba je sestavljena iz teh delov:
Del |
Opis |
Primerjava |
Izraz izraz operatorjem primerjave, ki primerja izraz z rezultati podpoizvedbe. |
izraz |
Izraz, za katerega je preiskan nabor rezultatov podpoizvedbe. |
sqlstatement |
Izjava SELECT, ki upošteva enako obliko zapisa in pravila kot katera koli druga izjava SELECT. Obdan mora biti z oklepaji. |
Opombe
Podpoizvedbo lahko uporabite namesto izraza na seznamu polj izjave SELECT ali v stavku WHERE ali HAVING. V podpoizvedbo z izjavo SELECT zagotovite nabor ene ali več določenih vrednosti, ki jih želite ovrednotiti v izrazu stavka WHERE ali HAVING.
Uporabite predikat ANY ali SOME, ki je sopomenka, če želite pridobiti zapise v glavni poizvedbi, ki izpolnjujejo pogoje primerjave s katerimi koli zapisi, pridobljenimi v podpoizvedbo. Spodnji primer vrne vse izdelke, katerih cena enote je večja od cene katerega koli izdelka, prodanega s popustom 25 odstotkov ali več:
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
Predikat ALL uporabite, če želite pridobiti le tiste zapise v glavni poizvedbi, ki izpolnjujejo pogoje primerjave z vsemi zapisi, pridobljenimi v podpoizvedbo. Če ste v prejšnjem primeru vrednost ANY spremenili v VSE, bo poizvedba vrnila le tiste izdelke, katerih cena enote je večja od cene vseh izdelkov, prodanih s popustom 25 odstotkov ali več. To je veliko bolj omejujoče.
Predikat IN uporabite, če želite pridobiti le tiste zapise v glavni poizvedbi, za katere nekateri zapisi v podpoizvedbe vsebujejo enako vrednost. Spodnji primer vrne vse izdelke s popustom 25 odstotkov ali več:
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
Nasprotno pa lahko uporabite NOT IN, če želite pridobiti le tiste zapise v glavni poizvedbi, za katere noben zapis v podpoizvedbe ne vsebuje enake vrednosti.
Predikat EXISTS (z izbirno rezervirano besedo NOT) uporabite v primerjavah resnično/neresnično, če želite ugotoviti, ali podpoizvedba vrne kateri koli zapis.
Vzdevke imen tabele lahko uporabite tudi v podpoizvedbah, če se želite sklicevati na tabele, navedene v stavku FROM zunaj podpoizvedbe. Spodnji primer vrne imena zaposlenih, katerih plače so enake ali večje od povprečne plače vseh zaposlenih z enakim nazivom delovnega mesta. Tabela »Zaposleni« ima vzdevek »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 prejšnjem primeru je pogoj AS rezervirana beseda izbiren.
Nekatere podpoizvedbe so dovoljene v navzkrižnih poizvedbah – še posebej kot predikate (tiste v stavku WHERE). Podpoizvedbe kot izhodi (tiste na seznamu SELECT) niso dovoljene v navzkrižnih poizvedbah.