Querys recursivos : Jerarquía

Tenemos la siguiente tabla :

1° campo : id de la zona

2° campo : descripción de la zona

3° campo : id de la zona padre

Con este query podemos obtener la jerarquía de una zona (mostrando todos sus sucesores):

En este ejemplo, los sucesores de "Region"

select de_geographical_zone, LEVEL
from geographical_zone
START WHITH co_geographical_zone = 2
CONNECT BY PRIOR co_geographical_zone = co_geog_zone_parent order by level


El campo level no existe en la tabla, es una variable de oracle.

Lo complicado aquí es obtener los padres o predecesores de una zona :

podemos usar el SYS_CONNECT_BY_PATH :

select
SYS_CONNECT_BY_PATH(de_geographical_zone, '\') as descripcion, LEVEL
from geographical_zone
where co_geographical_zone = 4
CONNECT BY PRIOR co_geographical_zone = co_geog_zone_parent
order by level

Lo malo que vamos a tener un separador que lo divide :(

para este caso agregaríamos los métodos INSTR y SUBSTR

select
SUBSTR(SYS_CONNECT_BY_PATH(de_geographical_zone_type, '\') || '\',
(INSTR(SYS_CONNECT_BY_PATH(de_geographical_zone_type, '\')|| '\','\',1,1)+1),
(INSTR(SYS_CONNECT_BY_PATH(de_geographical_zone_type, '\')|| '\','\',1,2))-2) as descripcion,
LEVEL
from geographical_zone
where co_geographical_zone = 4
CONNECT BY PRIOR co_geographical_zone = co_geog_zone_parent
order by level

Comentarios

Alexander Villalba ha dicho que…
hice un programa en java que hace querys recursivos (y estoy seguro que de que esta bien) y los resultados difieren con las consultas que recomiendas, las cuales por cierto también comprobé que tienen errores. ¿sera erróneo tu codigo o es que no interprete bien?
ckomiya ha dicho que…
ya tengo dudas al respecto, si puedes me mandas tu código a mi mail (christian.komiya@gmail.com)