Podzapytania: CTE (Common Table Expressions) cz. IV
W poprzedniej części tego artykułu omawiałem podzapytania jako źródło danych. Teraz będziemy kontynuować tą tematykę z tym, że zastosujemy w naszych kwerendach specjalne wyrażenie tabelaryczne CTE – Common Table Expressions specjalnie stworzone do tego typu konstrukcji.
Ogólna składnia CTE:
;WITH nazwaCTE AS (podzapytanie wewnętrzne) SELECT * FROM nazwaCTE; --podzapytanie główne
Przykład
;WITH nazwaCTE AS (SELECT kol1, kol2 FROM tabela) -- podzapytanie (wewnętrzne) SELECT * FROM nazwaCTE; -- zapytanie główne (zewnętrzne)
Ta sama kwerenda bez CTE:
SELECT * FROM (SELECT kol1, kol2 FROM tabela);
Przy korzystaniu z CTE należy zwrócić uwagę na kilka rzeczy:
- Nazwę CTE podaje się po słowie kluczowym:
;WITH
(pamiętać o „;
„), - Do utworzonego CTE można się odwoływać dowolną ilość razy za pośrednictwem jego nazwy,
- Do CTE można się odwołać po jego zdefiniowaniu, jeżeli mamy jakieś rozbudowane zapytanie np. z kilkoma CTE to najpierw musimy je zdefiniować a potem się odwołać (nie można odwołać się do CTE, które zostało zdefiniowane później).
Ćwiczenie
Przejdźmy teraz do przykładu, który opisywałem już w poprzedniej części tego wpisu. Mamy więc następujące tabele:
komputery
:
Nazwa | Cena |
ASUS T200TA | 2000 |
MacBook PRO | 6800 |
Lenovo YOGA 2 | 2500 |
Dell XPS | 6000 |
drukarki
:
Nazwa | Cena |
HP DESJKET | 170 |
Canon PIXMA MX395 | 220 |
EPSON XP-215 | 330 |
monitory
:
Nazwa | Cena |
Samsung SyncMaster TA23A350 | 1000 |
EIZO FlexScan EV2730Q | 3400 |
EIZO LCD EV2436WFS3-BK | 1800 |
Chcemy obliczyć średnią cenę sprzętu komputerowego, czyli średnią cenę z komputerów, drukarek oraz monitorów. Do tego celu wykorzystamy podzapytania oraz CTE:
;WITH cte AS ( SELECT AVG(Cena) AS Cena FROM komputery UNION ALL SELECT AVG(Cena) AS Cena FROM drukarki UNION ALL SELECT AVG(Cena) AS Cena FROM monitory ) SELECT AVG(Cena) FROM cte;
Rezultat:
AVG(Cena) |
2422 |