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:

  1. Základný dopyt: Počiatočná množina riadkov
  2. 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 RECURSIVE umožň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!