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);