jueves, 16 de junio de 2011

START WITH .... CONNECT BY

Para poder recorrer estructuras en forma de árbol usamos esta clausula.

Para hacer un ejemplo sencillo, supongamos que tenemos una tabla cargada como un arbol de categorías, en donde una categoría posee un posible padre, el mismo marcado por la columna “parent_id”.

Para recorrer todo una rama empezando por su id podemos hacer lo siquiente:

SQL> SELECT *
2 FROM categorías
3 START WITH id =
4 CONNECT BY PRIOR parent_id = id;
Lo que marca la dirección en que va a ser recorriendo el “arbol” es la claúsula PRIOR.

Si quisiéramos recorrer al revés, es decir desde una hoja hasta la raíz, debemos hacer:

SQL> SELECT *
2 FROM categorías
3 START WITH id =
4 CONNECT BY parent_id = PRIOR id;
A su vez, tenemos la pseudo-columna LEVEL, la cual nos brinda el “numero” de nivel en cual estamos, es decir que es un indicador de la profundidad del árbol en la cual nos encontramos (Oracle maneja hasta un nivel de profundidad de 255).

SQL> SELECT RPAD(' ', 2*(LEVEL-1)) || nombre
2 FROM categorías
3 START WITH parent_id IS NULL
4 CONNECT BY PRIOR parent_id = id;
Esto fue pantallazo general del tema pero sepan que existe mucho mas para investigar del START WITH y el CONNECT BY en Oracle

Espero les haya servido.

Saludos!
Gondalf

5 comentarios:

  1. Hola Gonzalo,

    Tengo una pregunta básica sobre este artículo, ¿Para qué sirve esto del START WITH y el CONNECT BY? Es decir, qué utilidad tiene o algún ejemplo de aplicación en la vida real?

    Gracias.

    ResponderEliminar
  2. Facundo, la utilidad es para consultas jerárquicas... Un ejemplo práctico puede ser, imaginate un árbol genealógico con los miembros mayores de la familia cerca de la base o tronco del árbol y los miembros mas jóvenes que
    representan ramas del árbol. Las ramas pueden tener sus propias ramas, etcétera. Es decir que necesitar recorrerlo si o si pensándolo como árbol, es decir jerarquicamente.

    ResponderEliminar
  3. Gracuas Gondalf. Una pregunta. Para que muestre los niveles por columna? Dependiente los niveles de niveles del árbol que sean las columnas? gracias

    ResponderEliminar
  4. Necesito hacer una consulta para saber si un padre tiene hijos y sino tiene asignarle un hijo.

    ResponderEliminar
  5. Buenas,
    si se el hijo ¿puedo saber quien es el padre (y padres de su padre)?

    Gracias

    Ejmplo: Si se "Menu 2.1.1.1" y tengo:

    ├Menu 1
    │ ├Menu 1.1
    │ │
    │ ├Menu 1.2
    │ │ └Menu 1.2.1
    │ │
    │ └Menu 3

    ├Menu 2
    │ ├Menu 2.1
    │ │ ├Menu 2.1.1
    │ │ │ ├Menu 2.1.1.1
    │ │ │ └Menu 2.1.1.2
    │ │ │
    │ │ └Menu 2.1.2
    │ │
    │ └Menu 2.2

    └Menu 3
    ├Menu 3.1
    ├Menu 3.2
    │ ├Menu 3.2.1
    │ └Menu 3.2.2

    └Menu 3.3

    Puedo obtener
    └Menu 2
    └Menu 2.1
    └Menu 2.1.1
    ├Menu 2.1.1.1
    └Menu 2.1.1.2

    ResponderEliminar