Lab 4

backback

Rozwiązania zadań 1-3

Zadanie 1.

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'

Zadanie 2.

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

Zadanie 3.

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

backback