Wypisz wszystkich podwładnych KINGa bez niego.
WITH sub (empno, ename) AS (
-- Baza struktury.
SELECT empno, ename
FROM emp
WHERE ename = 'KING'
UNION ALL
-- Rekurencyjna definicja kolejnych poziomów.
SELECT e.empno, e.ename
FROM emp e
JOIN sub s
ON e.mgr = s.empno
)
-- Zapytanie na obliczonej strukturze.
SELECT * FROM sub
WHERE ename <> 'KING'
Wypisz wszystkich podwładnych KINGa bez BLAKEa i jego podwładnych.
WITH sub (empno, ename) AS (
SELECT empno, ename
FROM emp
WHERE ename = 'KING'
UNION ALL
SELECT e.empno, e.ename
FROM emp e
JOIN sub s
ON e.mgr = s.empno
AND e.ename <> 'BLAKE' -- Wycinamy BLAKEa.
)
SELECT * FROM sub
Wypisz wszystkich pracowników, którzy mają pod sobą SALESMANa.
WITH sub (empno, ename, job, mgr, lvl) AS (
-- Zaczynamy od liści.
SELECT empno, ename, job, mgr, 1 AS lvl
FROM emp
WHERE job = 'SALESMAN'
UNION ALL
-- Idziemy w górę po `mgr`.
SELECT e.empno, e.ename, e.job, e.mgr, s.lvl + 1 AS lvl
FROM emp e
JOIN sub s
ON e.empno = s.mgr
)
SELECT DISTINCT empno, ename, job, lvl
FROM sub
WHERE lvl > 1 -- Usuwamy liście.
Alternatywnie:
WITH salesmen AS (
SELECT empno, ename, mgr
FROM emp
WHERE job = 'SALESMAN'
),
sub (empno, ename, mgr) AS (
-- Zaczynamy od menedżerów liści.
SELECT e.empno, e.ename, e.mgr
FROM salesmen s
JOIN emp e
ON s.mgr = e.empno
UNION ALL
-- Idziemy w górę po `mgr`.
SELECT e.empno, e.ename, e.mgr
FROM emp e
JOIN sub s
ON e.empno = s.mgr
)
SELECT DISTINCT empno, ename, mgr
FROM sub