Podzapytania w SQL Server

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;
Podzapytania w SQL Server
Podzapytania w SQL Server

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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *