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
gracias por la ayuda muy bueno
Hey man, buena info...