A hierarchikus lekérdezések egyik legnagyobb erénye a CONNECT_BY_ROOT unáris operátor, mely a paraméter oszlop értékét az adott sorhoz tartozó gyökérelemből veszi ki. Használata:
SELECT ename AS employee, CONNECT_BY_ROOT empno AS root, LEVEL
FROM scott.emp
START WITH ename='KING'
CONNECT BY NOCYCLE PRIOR empno = mgr AND LEVEL <= 4
Ennek segítségével erdő strukturák esetén meghatározhatjuk minden alsóbb szintű elem gyökerét, és ezzel azt, hogy mely más elemekkel közös fába esik. Oracle 10g alatt. Ugyanis a CONNECT_BY_ROOT operátor itt került bevezetésre.
Mit tehetünk, ha egy 9i verzión dolgozunk, és szükségét érezzük a fenti operátor használatának? Nos van egy kerülőút. Ez a
SYS_CONNECT_BY_PATH(column, char)
operátor. Ez valójában kicsit többet is tud, mint a CONNECT_BY_ROOT, hiszen a column értékeiből állít össze útvonalat a gyökér sortól az aktuális sorig, az útvonal elemeit a char szeparátorral elválasztva egymástól. A column értéke és az eredmény is karakteres formátumú lesz. Mint láthatjuk ebben benne van gyökér sor adott oszlopának értéke, tehát csak ki kell vágnunk:
SUBSTR(
SYS_CONNECT_BY_PATH(column, char),
2,
DECODE(
instr(
SYS_CONNECT_BY_PATH(column, char), char, 2
)
,0,LENGTH( SYS_CONNECT_BY_PATH(column, char) ) - 1
,INSTR(SYS_CONNECT_BY_PATH(column, char), char, 2) - 2
)
) AS connect_by_root
A módszernek persze két apróbb buktatója is akadhat. Az egyik az, hogy a column értéke csak karakteres lehet, tehát egy reverzibilis átalakítást kell végeznünk rajta, ha eredendően nem az, majd az eredményt visszaalakítani. A másik pedig az, hogy a szeparátor char nem fordulhat elő a column sztringben.