Zapytania hierarchiczne

W tabeli bazodanowej może zostać zaimplementowana struktura drzewiasta. Przykładem takiej konstrukcji jest tabela towary, w której pewne elementy są składnikami innych, te z kolei mogą być składnikami jeszcze innych itp.

W Oracle SQL istnieje specjalna konstrukcja, która dzięki klauzulom CONNECT BY PRIOR i START WITH pozwala operować na tak zaimplementowanych drzewach.
Klauzula CONNECT BY PRIOR pozwala zdefiniować połączenie pomiędzy ojcem i synem w drzewie. Kolejność kolumn w warunku nie jest obojętna. Najpierw powinien być wypisany ojciec a potem syn.
Klauzula START WITH pozwala określić korzeń drzewa.

Przykład

Wypisać informacje o wszystkich składnikach zestawu komputerowego (bezpośrednich i pośrednich).

SELECT *
  FROM towary
CONNECT BY PRIOR tow_id = tow_tow_id
START WITH tow_nazwa = 'Zestaw komputerowy';
                        

W zapytaniach hierarchicznych mamy do dyspozycji specjalną „pseudokolumnę” LEVEL dzięki której możemy stwierdzić, na jakim poziomie drzewa znajduje się dany wiersz.

Przykład

Wypisać nazwy wszystkich składników zestawu komputerowego (bezpośrednich i pośrednich), jednocześnie sygnalizując, na jakim poziomie znajduje się każdy składnik.

SELECT lpad(' ', 3*LEVEL) || tow_nazwa, LEVEL
  FROM towary
CONNECT BY PRIOR tow_id = tow_tow_id
START WITH tow_nazwa = 'Zestaw komputerowy';
                        

Podczas korzystania z zapytań hierarchicznych można używać klauzuli WHERE.

Przykład

Wypisać nazwy wszystkich składników zestawu komputerowego (bezpośrednich i pośrednich), jednocześnie sygnalizując, na jakim poziomie znajduje się każdy składnik. Wyeliminować z wyniku pozycję „Komputer”.

 SELECT lpad(' ', 3*LEVEL) || tow_nazwa
   FROM towary
  WHERE tow_nazwa <> 'Komputer'
CONNECT BY PRIOR tow_id = tow_tow_id
  START WITH tow_nazwa = 'Zestaw komputerowy';
                        

Warunki ograniczające wynik można również definiować w klauzuli CONNECT BY PRIOR, w której definiujemy wiązanie ojciec <-> syn.

Przykład

Wypisać nazwy wszystkich składników zestawu komputerowego (bezpośrednich i pośrednich), jednocześnie sygnalizując, na jakim poziomie znajduje się każdy składnik. Wyeliminować z wyniku pozycję „Komputer” i jego składniki.

 SELECT lpad(' ', 3*LEVEL) || tow_nazwa
   FROM towary
CONNECT BY PRIOR tow_id = tow_tow_id
    AND tow_nazwa <> 'Komputer'
  START WITH tow_nazwa = 'Zestaw komputerowy';