1. Czym są podzapytania w SQL Server?
Podzapytanie to zapytanie ujęte w innym zapytaniu. Wyobraź sobie, że pisząc nowe Query nie odwołujesz się do tabeli, czy widoku, a do wyniku innego zapytania w klauzuli FROM. Poniżej krótki schemat jak wygląda najprostsze podzapytanie.
--tomaszkenig.pl SELECT COL_1, COL_2 ... COL_N FROM (SELECT COL_1, COL_2 ... COL_N FROM BAZA.SCHEMAT.TABELA) ALIAS_PODZAPYTANIA;
Podzapytania w SQL Server możesz wstawiać w klauzulach FROM, SELECT, WHERE.
2. Podzapytanie w klauzuli FROM
Poniżej przykład z wykorzystaniem bazy AdventureWorks. Jak pewnie zauważyłeś podzapytanie ujmujemy w nawias i nadajemy mu alias. Przypisanie aliasu jest wymagane.
--tomaszkenig.pl SELECT * FROM ( SELECT * FROM person.address WHERE addressid < 1100 ) a WHERE addressline2 IS NOT NULL;
Ważne jest, że w SQL Server możesz użyć wielu podzapytań jednocześnie. Nie ma przeszkód, by stworzyć zapytanie pobierające dane z podzapytania, które to pobiera dane z innego podzapytania :). Stwórzmy krótki przykład. Dodatkowo wynik pierwszego podzapytania połączymy JOIN’em z tabelą.
--tomaszkenig.pl SELECT zzz.firstname, zzz.lastname FROM ( SELECT xxx.*, yyy.firstname, yyy.lastname FROM ( SELECT * FROM humanresources.employee WHERE birthdate >= '1980-01-01' ) xxx JOIN person.person yyy ON xxx.businessentityid = yyy.businessentityid WHERE xxx.jobtitle = 'Production Technician - WC60' ) zzz WHERE zzz.businessentityid < 40;
3. Podzapytania w klauzuli SELECT.
Poniżej przykład użycia podzapytania ujętego w klauzuli SELECT. Naszym celem jest przypisanie najwyższej stawki płacy do danego pracownika. Jak widzisz następuje tutaj samozłączenie tabeli HumanResources.EmployeePayHistory.
--tomaszkenig.pl SELECT DISTINCT c.businessentityid, c.firstname, c.lastname, ( SELECT MAX(b.rate) FROM humanresources.employeepayhistory b WHERE a.businessentityid = b.businessentityid ) FROM humanresources.employeepayhistory a JOIN person.person c ON a.businessentityid = c.businessentityid;
4. Podzapytania w klauzuli WHERE.
Poniżej przykład użycia podzapytania w klauzuli WHERE. Celem zapytania jest zwrócenie jedynie osób, które mają przypisany tytuł w kolumnie title. Tabela Person.Person.
--tomaszkenig.pl SELECT FirstName,LastName,title,BusinessEntityID FROM PERSON.Person WHERE BusinessEntityID in (SELECT BusinessEntityID FROM Person.person where title is not null);