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:

  1. Základní dotaz: Počáteční množina řádků
  2. 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 RECURSIVE umožň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!