Hierarchikus lekérdezések (START WITH, CONNECT BY) ------------------------- SELECT [LEVEL], column, expr... FROM table [WHERE condition(s)] [START WITH condition(s)] [CONNECT BY PRIOR condition(s)] ; ahol WHERE condition: expr comparison_operator expr Fa bejárása Kiindulás: START WITH column1 = value CONNECT BY PRIOR column1 = column2 Felülről-lefelé: Column1 = Parent Key Column2 = Child Key Alulról-felfelé: Column1 = Child Key Column2 = Parent Key A művelet arra való, hogy hierarchikus szerkezetű adatokat is le tudjunk kérdezni egy SELECT utasítás segítségével. A hierarchia gyökerét (gyökereit) a START WITH -del kell megadni. A szülő és gyermek sorok közti kapcsolatot a CONNECT BY clause-zal. Ebben használhatjuk a PRIOR kulcsszót, amelyik a szülő sorra utal (lásd alább). Az ilyen jellegű lekérdezések eseten a kiértékelés sorrendje a következő: 1. A START WITH alapján kiválasztja a gyökér sorokat. 2. A CONNECT BY alapján a gyökerek gyerekeit választja ki. 3. A további leszármazottakat választja ki mélységi keresési stratégiával. 4. A WHERE alapján kiszűri a sorokat, de az eldobott sorok leszármazottait nem dobja el. Vagyis a feltételt minden egyes sorra külön-külön értékeli ki. 5. A sorokat a preorder bejárás szerinti sorrendben adja vissza. Ha egy SELECT hierarchikus struktúrát kérdez le, akkor nem használhat join műveletet. A CONNECT BY után akár több feltételt is használhatunk. De ha kört talál a struktúrában akkor hibát ad. pl. CONNECT BY PRIOR empno=mgr AND salary > commission Itt az empno a szülő sorra vonatkozik, a többi a gyerek sorra. Használhatjuk a LEVEL pszeudo oszlopot, amelyik a gyökér sorokra egyet ad vissza, a többiekre, pedig a megfelelő mélységet. pl. SELECT LPAD(' ', 4*(LEVEL-1)) || ename, empno, mgr, job FROM emp START WITH job='PRESIDENT' CONNECT BY PRIOR empno = mgr; ORDER BY (Oracle 9-estől SIBLINGS, NULLS FIRST, NULLS LAST) SELECT LPAD(' ', 2*LEVEL)||ename FROM emp START WITH job= 'PRESIDENT' CONNECT BY PRIOR empno=mgr ORDER SIBLINGS BY ename [NULLS FIRST | LAST] Adjuk meg az ORAUSER.VAGYONOK tábla alapján KAIN unokáinak az össz-vagyonát. SELECT SUM(vagyon) -- LPAD(' ', 4*(LEVEL-1)) || nev, apja, vagyon FROM orauser.vagyonok WHERE LEVEL = 3 START WITH nev='KAIN' CONNECT BY PRIOR nev = apja; A fenti típusú rekurzió csak akkor megengedett az Oracle-ben, ha nincs kör a gráfban, vagyis az fa szerkezetű. (összefüggő, körmentes gráf -> fa)