Con la función level pretendo mostrar cómo dar solución a un problema muy común que se puede dar. Supongamos que disponemos de una tabla en la que almacenamos los nombres de las carpetas de una estructura de carpetas. En esa misma tabla, tendremos el nombre de la carpeta, el id de la carpeta y el id de la carpeta padre (que se encuentra en la misma tabla).

Una representación del ejemplo:

FolderId ParentFolderId Name

1

1 Carpeta padre

2

1

1.1 Carpeta hija

4

2

1.1.1 Carpeta nieta

3

1

1.2 Carpeta hija

5

3

1.2.1 Carpeta nieta

Para obtener un listado de todas las carpetas ordenadas según la estructura, en código Java habría que implementar una función recursiva que sacase por consola el nombre de los hijos, y así recursivamente hasta que sacase los nietos, hijos y el padre.

Pero para obtener el mismo resultado con SQL no es tan sencillo, aunque se puede sacar haciendo un join de la tabla consigo misma ayudándose del group by y demás. Para simplificar esa SQL que nos puede salir tan enorme, tenemos la función level. Esta función nos indica el nivel de profundidad que tendrá nuestra carpeta. La función level por si sóla no muestra información útil, hay que combinarla con la instrucción start with y connect by prior para indicar cuál será nuestra carpeta raíz y si queremos que nos genere el árbol de arriba a abajo o al revés.

Un ejemplo de la SQL sería:

select f.folderid, f.parentfolderid, f.name, level
from folder f
     start with f.folderid = 1
           and f.parentfolderid is null  -- Empieza por el raíz
     connect by prior f.folderid = f.parentfolderid -- Genera el árbol hacia abajo

Formas de generar el árbol

  • Hacía arriba: connect by prior f.parentfolderid=f.folderid
  • Hacía abajo: connect by prior f.folderid=f.parentfolderid
Advertisements

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

CERRAR

Pin It on Pinterest

Share This

Compártelo

¡Comparte este artículo con tus amigos!