Klauzule SQL WITH: Common Table Expressions (CTE) a rekurzivní dotazy
Published: 2026-02-04
Klauzule WITH (také nazývaná Common Table Expression neboli CTE) vám umožňuje definovat dočasné pojmenované množiny výsledků, na které se můžete v dotazu odkazovat. Díky tomu jsou složité dotazy čitelnější a znovupoužitelné. Je dostupná ve většině moderních SQL databází včetně SQLite, PostgreSQL, MySQL 8.0+, SQL Serveru a Oracle.
Ukázková data
Ve všech příkladech používáme dvě tabulky:
Tabulka employees:
| id | name | manager_id | salary |
|---|---|---|---|
| 1 | Alice | NULL | 120000 |
| 2 | Bob | 1 | 80000 |
| 3 | Carol | 1 | 85000 |
| 4 | Dave | 2 | 60000 |
| 5 | Eve | 2 | 62000 |
| 6 | Frank | 3 | 58000 |
Tabulka sales:
| id | employee_id | amount | month |
|---|---|---|---|
| 1 | 2 | 5000 | January |
| 2 | 2 | 6000 | February |
| 3 | 3 | 7000 | January |
| 4 | 3 | 8000 | February |
| 5 | 4 | 3000 | January |
| 6 | 5 | 4000 | January |
| 7 | 6 | 2500 | February |
Základní klauzule WITH (nerekurzivní)
Klauzule WITH definuje jednu nebo více pojmenovaných dočasných tabulek, které existují pouze po dobu trvání dotazu.
Příklad: Celkové prodeje podle zaměstnance
CTE employee_sales vypočítá celkové prodeje na zaměstnance a poté ji spojíme s tabulkou employees, abychom zobrazili jména.
Více CTE
Můžete definovat více CTE oddělených čárkami. Pozdější CTE se mohou odkazovat na ty dřívější.
Příklad: Analýza prodejů s více metrikami
WITH RECURSIVE: Procházení hierarchií
WITH RECURSIVE umožňuje, aby se CTE odkazovala sama na sebe, což vám umožní procházet hierarchická nebo stromová data. To je užitečné pro organizační struktury, hierarchie kategorií nebo jakékoli vztahy rodič–potomek.
Rekurzivní CTE má dvě části:
- Základní dotaz: Počáteční množina řádků
- Rekurzivní dotaz: Odkazuje se na samotnou CTE, aby našel související řádky
Příklad: Organizační struktura (všichni zaměstnanci pod manažerem)
Najděte všechny zaměstnance pod Alicí (CEO):
Příklad: Řetězec velení (nalezení manažerské hierarchie)
Najděte celý řetězec velení pro Davea (který reportuje Bobovi, který reportuje Alici):
Syntaxe WITH RECURSIVE v různých databázích
WITH RECURSIVE je podporováno v:
- SQLite — 3.8.3+ (2013)
- PostgreSQL — 8.4+ (2009)
- SQL Server — 2005+ (nazývá se “Recursive CTE”)
- Oracle — 11g+ (nazývá se “Recursive Subquery Factoring”)
- MySQL — 8.0+ (2018)
Poznámka: Starší verze MySQL a některé další databáze nepodporují rekurzivní CTE – mohou vyžadovat jiné přístupy, jako jsou uložené procedury nebo rekurze na úrovni aplikace.
Běžné případy použití klauzulí WITH
- Zjednodušení složitých dotazů — Rozdělení velkého dotazu na logické kroky
- Znovupoužití poddotazů — Definujte výpočet jednou a použijte ho vícekrát
- Procházení hierarchií — Navigace ve stromech (organizační struktury, kategorie, komentáře)
- Generování posloupností — Vytváření číselných nebo datumových rozsahů
- Postupné agregace — Sestavování výsledků po krocích
Shrnutí
WITH(CTE) vytváří pojmenovanou dočasnou množinu výsledků pro použití v dotazu- Více CTE lze řetězit za sebou
WITH RECURSIVEumožňuje, aby se CTE odkazovala sama na sebe pro hierarchické dotazy- Rekurzivní CTE vyžadují základní část a rekurzivní část oddělené pomocí
UNION ALL - Podporováno ve všech moderních SQL databázích (i když se syntaxe může mírně lišit)
Zkuste upravit výše uvedené příklady a prozkoumat různé hierarchie nebo výpočty!