Klauzula SQL WITH: Common Table Expressions (CTE) a rekurzívne dopyty
Published: 2026-02-04
Klauzula WITH (nazývaná aj Common Table Expression alebo CTE) vám umožňuje definovať dočasné pomenované množiny výsledkov, na ktoré sa môžete odkazovať v dopyte. Vďaka tomu sú zložité dopyty čitateľnejšie a znovupoužiteľné. Je dostupná vo väčšine moderných SQL databáz vrátane SQLite, PostgreSQL, MySQL 8.0+, SQL Server a Oracle.
Vzorové dáta
Vo všetkých príkladoch používame dve tabuľky:
Tabuľka 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 |
Tabuľka 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á klauzula WITH (nerekurzívna)
Klauzula WITH definuje jednu alebo viac pomenovaných dočasných tabuliek, ktoré existujú len počas trvania dopytu.
Príklad: Celkové predaje podľa zamestnanca
CTE employee_sales vypočíta celkové predaje na zamestnanca, potom ju spojíme s tabuľkou employees, aby sme zobrazili mená.
Viacero CTE
Môžete definovať viacero CTE oddelených čiarkami. Neskoršie CTE sa môžu odkazovať na tie skoršie.
Príklad: Analýza predajov s viacerými metrikami
WITH RECURSIVE: Prechádzanie hierarchií
WITH RECURSIVE umožňuje, aby sa CTE odkazovala sama na seba, čo vám umožní prechádzať hierarchické alebo stromové dáta. Je to užitočné pre organizačné štruktúry, kategórie alebo akékoľvek vzťahy rodič–dieťa.
Rekurzívne CTE má dve časti:
- Základný dopyt: Počiatočná množina riadkov
- Rekurzívny dopyt: Odkazuje sa na samotné CTE, aby našiel súvisiace riadky
Príklad: Organizačná štruktúra (všetci zamestnanci pod manažérom)
Nájdite všetkých zamestnancov pod Alice (CEO):
Príklad: Reťaz velenia (nájdenie manažérskej hierarchie)
Nájdite celú reťaz velenia pre Davea (ktorý reportuje Bobovi, ktorý reportuje Alice):
Syntax WITH RECURSIVE v rôznych databázach
WITH RECURSIVE je podporované v:
- SQLite — 3.8.3+ (2013)
- PostgreSQL — 8.4+ (2009)
- SQL Server — 2005+ (nazývané „Recursive CTE“)
- Oracle — 11g+ (nazývané „Recursive Subquery Factoring“)
- MySQL — 8.0+ (2018)
Poznámka: Staršie verzie MySQL a niektoré iné databázy nepodporujú rekurzívne CTE — môžu vyžadovať iné prístupy, ako sú uložené procedúry alebo rekurzia na úrovni aplikácie.
Bežné použitia klauzúl WITH
- Zjednodušenie zložitých dopytov — Rozdeľte veľký dopyt na logické kroky
- Znovupoužitie poddopytov — Definujte výpočet raz a použite ho viackrát
- Prechádzanie hierarchií — Navigácia v stromoch (organizačné štruktúry, kategórie, komentáre)
- Generovanie postupností — Vytváranie číselných alebo dátumových rozsahov
- Postupné agregácie — Budovanie výsledkov v krokoch
Zhrnutie
WITH(CTE) vytvára pomenovanú dočasnú množinu výsledkov na použitie v dopyte- Viacero CTE môže byť naviazaných za sebou
WITH RECURSIVEumožňuje, aby sa CTE odkazovala sama na seba pre hierarchické dopyty- Rekurzívne CTE vyžadujú základný prípad a rekurzívny prípad oddelené pomocou
UNION ALL - Podporované vo všetkých moderných SQL databázach (hoci syntax sa môže mierne líšiť)
Skúste upraviť vyššie uvedené príklady a preskúmať rôzne hierarchie alebo výpočty!