SQL> @mostrarArbol SQL> /* @mostrarArbol */ SQL> SQL> set echo on SQL> set linesize 120 SQL> set pagesize 60 SQL> SQL> column rfNodo heading "idNodo" format 999 SQL> column rfPadre heading "idPadre" format 999 SQL> column nodo format A12 SQL> column Padre format A12 SQL> column namNodo format A16 SQL> column Path format A80 SQL> column level format 999 SQL> SQL> /* mostrar todas las tuplas de la tabla SQL> */ SQL> SELECT * FROM Arbol; idNodo NAMNODO idPadre ------ ---------------- ------- 10 nodo10 6 9 nodo09 6 8 nodo08 5 7 nodo07 5 6 nodo06 3 5 nodo05 3 4 nodo04 3 14 nodo14 12 13 nodo13 12 12 nodo12 11 11 nodo11 2 3 nodo03 1 2 nodo02 1 1 nodo01 14 rows selected. SQL> SQL> /* mostrar cada nodo con su padre (se repiten) SQL> */ SQL> SELECT * 2 FROM Arbol 3 CONNECT BY PRIOR rfnodo = rfpadre; idNodo NAMNODO idPadre ------ ---------------- ------- 3 nodo03 1 6 nodo06 3 10 nodo10 6 9 nodo09 6 5 nodo05 3 8 nodo08 5 7 nodo07 5 4 nodo04 3 2 nodo02 1 11 nodo11 2 12 nodo12 11 14 nodo14 12 13 nodo13 12 11 nodo11 2 12 nodo12 11 14 nodo14 12 13 nodo13 12 6 nodo06 3 10 nodo10 6 9 nodo09 6 5 nodo05 3 8 nodo08 5 7 nodo07 5 4 nodo04 3 8 nodo08 5 7 nodo07 5 10 nodo10 6 9 nodo09 6 12 nodo12 11 14 nodo14 12 13 nodo13 12 14 nodo14 12 13 nodo13 12 1 nodo01 3 nodo03 1 6 nodo06 3 10 nodo10 6 9 nodo09 6 5 nodo05 3 8 nodo08 5 7 nodo07 5 4 nodo04 3 2 nodo02 1 11 nodo11 2 12 nodo12 11 14 nodo14 12 13 nodo13 12 47 rows selected. SQL> SQL> /* mostrar ordenados todos los nodos con su padre SQL> */ SQL> SELECT DISTINCT * 2 FROM Arbol 3 CONNECT BY PRIOR rfnodo = rfpadre 4 ORDER BY namNodo; idNodo NAMNODO idPadre ------ ---------------- ------- 1 nodo01 2 nodo02 1 3 nodo03 1 4 nodo04 3 5 nodo05 3 6 nodo06 3 7 nodo07 5 8 nodo08 5 9 nodo09 6 10 nodo10 6 11 nodo11 2 12 nodo12 11 13 nodo13 12 14 nodo14 12 14 rows selected. SQL> SQL> /* mostrar el árbol comenzando desde la raiz (en preorden) SQL> */ SQL> SELECT DISTINCT * 2 FROM Arbol 3 START WITH rfPadre IS NULL 4 CONNECT BY PRIOR rfnodo=rfpadre; idNodo NAMNODO idPadre ------ ---------------- ------- 1 nodo01 2 nodo02 1 3 nodo03 1 4 nodo04 3 5 nodo05 3 6 nodo06 3 7 nodo07 5 8 nodo08 5 9 nodo09 6 10 nodo10 6 11 nodo11 2 12 nodo12 11 13 nodo13 12 14 nodo14 12 14 rows selected. SQL> SQL> /* mostrar el árbol comenzando desde la raiz (en preorden) junto con el nivel SQL> y el path (el nombre del nodo se muestra sangrado) SQL> */ SQL> SELECT lpad(' ', level-1 )||namNodo nodo, level, SYS_CONNECT_BY_PATH(namNodo, '/') "Path" 2 FROM Arbol 3 START WITH rfPadre IS NULL 4 CONNECT BY rfpadre = PRIOR rfnodo; NODO LEVEL Path ------------ ----- ----------------------------------------------------------------------- nodo01 1 /nodo01 nodo03 2 /nodo01/nodo03 nodo06 3 /nodo01/nodo03/nodo06 nodo10 4 /nodo01/nodo03/nodo06/nodo10 nodo09 4 /nodo01/nodo03/nodo06/nodo09 nodo05 3 /nodo01/nodo03/nodo05 nodo08 4 /nodo01/nodo03/nodo05/nodo08 nodo07 4 /nodo01/nodo03/nodo05/nodo07 nodo04 3 /nodo01/nodo03/nodo04 nodo02 2 /nodo01/nodo02 nodo11 3 /nodo01/nodo02/nodo11 nodo12 4 /nodo01/nodo02/nodo11/nodo12 nodo14 5 /nodo01/nodo02/nodo11/nodo12/nodo14 nodo13 5 /nodo01/nodo02/nodo11/nodo12/nodo13 14 rows selected. SQL> SQL> /* mostrar los nodos que están al nivel especificado interactivamente SQL> */ SQL> SELECT namNodo nodo, level, SYS_CONNECT_BY_PATH(namNodo, '/') "Path" 2 FROM Arbol 3 WHERE level = &nivelBuscado 4 START WITH rfPadre IS NULL 5 CONNECT BY PRIOR rfnodo=rfpadre; Enter value for nivelbuscado: 3 old 3: WHERE level = &nivelBuscado new 3: WHERE level = 3 NODO LEVEL Path ------------ ----- ----------------------------------------------------------------------- nodo06 3 /nodo01/nodo03/nodo06 nodo05 3 /nodo01/nodo03/nodo05 nodo04 3 /nodo01/nodo03/nodo04 nodo11 3 /nodo01/nodo02/nodo11 SQL> SQL> /* mostrar el subArbol correspondiente al nodo especificado interactivamente SQL> */ SQL> SELECT lpad(' ', level-1 )||namNodo nodo, level, SYS_CONNECT_BY_PATH(namNodo, '/') "Path" 2 FROM Arbol 3 START WITH rfNodo = &nodoRaiz 4 CONNECT BY PRIOR rfnodo=rfpadre; Enter value for nodoraiz: 2 old 3: START WITH rfNodo = &nodoRaiz new 3: START WITH rfNodo = 2 NODO LEVEL Path ------------ ----- ----------------------------------------------------------------------- nodo02 1 /nodo02 nodo11 2 /nodo02/nodo11 nodo12 3 /nodo02/nodo11/nodo12 nodo14 4 /nodo02/nodo11/nodo12/nodo14 nodo13 4 /nodo02/nodo11/nodo12/nodo13 SQL> SQL> /* en Oracle 10 se introducen más operadores */ SQL> SQL> spool off