Skip to main content

3.8 Práca s rekurzívnymi reláciami

Niekedy sa potrebujeme vysporiadať s rekurzívnou reláciou (pozri kapitolu 1.7 Alternatívne, hierarchické a rekurzívne relácie). Typickým príkladom je tabuľka zamestnancov (Employees): každý zamestnanec má nadriadeného, ktorý je však tiež len zamestnancom a nachádza sa v tej istej tabuľke. Odkaz teda smeruje do vlastných radov.

Nie je to problém - spájať môžeme aj tabuľku samú so sebou (takzvaný Self Join), akurát ich nutne musíme rozlíšiť aliasom tabuľky:

V SQL to nie je problém – tabuľku môžeme spojiť aj samu so sebou (takzvaný Self Join). Aby databázový systém vedel rozlíšiť, kedy myslíme zamestnanca a kedy jeho šéfa, musíme použiť aliasy. Predstavte si to tak, akoby sme si na chvíľu vytvorili dve virtuálne kópie tej istej tabuľky a dali im rôzne mená:

  • {tabuľka} {alias 1} JOIN {tabuľka} {alias 2}

Pri odvolávaní sa na konkrétne stĺpce musíme uviesť alias, aby bolo jasné, o ktorú „kópiu“ ide. Napríklad, ak chceme zoznam zamestnancov s uvedením ich nadriadeného, jedna strana spojenia bude v pozícii zamestnanca (alias z) a druhá nadriadeného (alias n):

SELECT
  z.last_name AS zamestnanec,
  n.last_name AS nadriadeny
FROM employees z
  JOIN employees n ON (z.manager_id = n.employee_id)
ORDER BY zamestnanec;

V tomto zozname chýba najvyšší šéf, ktorý nemá nadriadeného (hodnota NULL). Keďže používame vnútorné spojenie, záznamy s NULL sa nespárujú. To však už vieme riešiť - spomeňte si na LEFT OUTER JOIN.

Poznámka pre pokročilých: Tento spôsob nám vypíše iba priameho nadriadeného (o jednu úroveň vyššie). Ak by sme chceli vypísať celú hierarchiu (stromovú štruktúru), Oracle SQL podporuje aj hierarchické dopyty (kapitola 6.4 v Oracle Academy) a v štandardnom SQL (PostgreSQL / MariaDB) rekurzívne dopyty pomocou WITH RECURSIVE. Tým sa však v tomto kurze zaoberať nebudeme.