Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

select recursivo

Estas en el tema de select recursivo en el foro de Oracle en Foros del Web. Tengo un prolema con un select recursivo. El select me funciona correctamente SELECT PADREID, LEVEL NIVEL FROM RELACIONES R START WITH R.HIJOID=37401 CONNECT BY PRIOR ...
  #1 (permalink)  
Antiguo 08/02/2007, 09:11
Avatar de chuscazo  
Fecha de Ingreso: abril-2004
Mensajes: 84
Antigüedad: 13 años, 8 meses
Puntos: 0
select recursivo

Tengo un prolema con un select recursivo.

El select me funciona correctamente
SELECT
PADREID,
LEVEL NIVEL
FROM
RELACIONES R
START WITH
R.HIJOID=37401
CONNECT BY
PRIOR R.PADREID = R.HIJOID ORDER BY LEVEL


Esto me devuelve una todo el arbol desde el hijo al padre ordenados por el nivel, osea el que esta mas lejos del elemento principal primero.

Ahora quiero sacar el primer nombre (de la tabla nombres) no nulo de los elementos recorridos por esta consulta. He intentado enlazar las tablas en esta consulta y con codigo cojer el primero, ya que estan ordenados por level, pero no me funciona. ¿Se pueden enlazar?, ¿como?

Tambien he intentado con una subquery sobre esta, pero al no poder poner un order en la subquery, pues no se si en verdad es el de menor orden.

SELECT NOMBRE FROM NOMBRES WHERE EXISTS (
SELECT
PADREID,
LEVEL NIVEL
FROM
WHERE NOMBREID=PADREID
RELACIONES R
START WITH
R.HIJOID=37401
CONNECT BY
PRIOR R.PADREID = R.HIJOID GROUP BY LEVEL,PADREID)


¿Se os ocurre algo?
Gracias, saludos.
  #2 (permalink)  
Antiguo 08/02/2007, 09:40
Avatar de chuscazo  
Fecha de Ingreso: abril-2004
Mensajes: 84
Antigüedad: 13 años, 8 meses
Puntos: 0
Re: select recursivo

Ya se me ocurrio,

Hay que crear una vista de la recursiva y ya enlazas la vista con la tabla nombres.

Gracias
  #3 (permalink)  
Antiguo 04/07/2008, 10:55
 
Fecha de Ingreso: mayo-2005
Mensajes: 103
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: select recursivo

Cita:
Iniciado por chuscazo Ver Mensaje
Ya se me ocurrio,

Hay que crear una vista de la recursiva y ya enlazas la vista con la tabla nombres.

Gracias

podrias explicar tu respuesta con dibujitos?

no entendi mucho gracias.
  #4 (permalink)  
Antiguo 07/07/2008, 01:46
Avatar de chuscazo  
Fecha de Ingreso: abril-2004
Mensajes: 84
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: select recursivo

No me estraña XDDDDD.

Se trata de hacer una consulta y almacenarla en una vista temporal para luego hacer la consulta sobre ella. Seria mas o menos así:

SELECT * FROM (
SELECT PADREID, LEVEL NIVEL
FROM RELACIONES R
START WITH R.HIJOID=37401
CONNECT BY PRIOR R.PADREID = R.HIJOID ) TEMPORAL , NOMBRRES
WHERE TEMPORAL.PADREID = NOMBRES.ID
ORDER BY NIVEL

TEMPORAL se trata como una tabla cuyo contenido es el resulatado de la consulta:
SELECT PADREID, LEVEL NIVEL
FROM RELACIONES R
START WITH R.HIJOID=37401
CONNECT BY PRIOR R.PADREID = R.HIJOID

Si tienes alguna duda mas no escatimes en preguntas.

Saludos
  #5 (permalink)  
Antiguo 07/07/2008, 16:26
 
Fecha de Ingreso: mayo-2005
Mensajes: 103
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: select recursivo

crees tu que el script, se demora mucho? suponiendo que tengo que sacar 1 datos con todas sus relaciones sobre 2 millones de registros.
saludos.

gracias.
  #6 (permalink)  
Antiguo 07/07/2008, 16:42
 
Fecha de Ingreso: mayo-2005
Mensajes: 103
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: select recursivo

me despliega el siguiente error:

Connect by loop in user data.

como puedo evitar este mensaje.
  #7 (permalink)  
Antiguo 08/07/2008, 01:38
Avatar de chuscazo  
Fecha de Ingreso: abril-2004
Mensajes: 84
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: select recursivo

Pues la verdad que hace tiempo que no no toco esa cnsulta ya que lleve tiempo funcionando bien. Pero he encntrado una respuesta en otro foro que creo que te será muy util.

Código:
Hola,
Por lo que me estás indicando, todo tiene la apariencia de intentar consultar información aparentemente de arbol jerarquizado, pero que en algunas de sus ramas aparecen los que llamado en 'C' listas circulares.
En principio los operadores de 'Start with ... Connect by prior ...' estan diseñados para arboles perfectamente jerarquicos donde la recusividad no ha de ser infinita (listas circulares ni reflexivas. Ni en el otro caso de asociación recursiva (uno es padre de si mismo!).
De todas formas me tendrías que haber indicado la version de Oracle con la que estás trabajando.
En la excepcion de 'REFLEXIVIDAD' (un elemento es padre de si mismo) es muy facil de solucionar, simplemente indicando en la clausula del predicado :
WHERE Columna_Padre != Columna_Hijo que son las dos que utilizar en el 'connect by prior ...' para establecer la relación.
Luego si quieres que aparezcan como resultado, simplemente tienes que añadir a tu consulta una 'UNION' o mejor un 'UNION ALL' si los datos que devuelves en la consulta nunca se duplicaran en ambas consultas (ya que el rendimiento es mejor).
Select_con_connect_by_prior
UNION ALL
Select columnas
from tablas
where columna_padre = columna_hijo;
Respecto al tema de 'listas circulares' el problema puede ser mucho más complejo. Pero vamos a ver si lo podemos solventar de alguna de las formas que explico a continuación :
En la versión 11g de Oracle cuentas con la solución a las listas ciclicas, identificando en la propia condición que si se trata de una lista ciclica, no se repita. La forma es utilizando :
Select ...
from ...
Where ...
Start with ...
Connect by NOCYCLE prior padre = hijo
El 'CONNECT BY NOCYCLE PRIOR ...' te salva de estas situaciones!!!
Supongo que te saldrá cuando lo utilizas ahora en listas circulares un error : ORA-01436 con un texto más o menos como este : 'CONNECT BY loop in teh user data'.
Pero esta OPCION sólo está habilitada a partir de la 10g en adelante, por eso el preguntarte que debias de haberme indicado la version con la que estás trabajando.
Pero si estás en otra versión ...
1.- Si la relacion es entre columnas numericas entre padres e hijos y los hijos siempre tendran un número inferior al de sus padres (muchas cohincidencias ...) entonces con añadir a tu sentencia en el 'WHERE' que 'columna_padre < columna hijo' podria ser una solución.
2.- Otra solucion es trabajar con el valor de la pseudo-columna LEVEL.
Puedes poner que el nivel no supere a un determinado valor colocando :
Select distinct .... connect by prior padre = hijo and LEVEL < 20;
El condicionante de esta solución es que el arbol no tenga más de 20 ramas, y que ninguna relación de las columnas especificada se repita (y no incluir level en la lista de columnas a recuperar).
:-(
Por último, la única forma de realizarlo es mediante la creación de una función que analize 'tokems' y controlarlo emulando el CONNECT BY PRIOR.
;-(
Si quieres ves haciendo la prueba. Indicame si trabajas con alguna versión de Oracle inferior a la 10g, para intentar emular y solventar esta situación de alguna forma ...
Mientras espero tu respuesta, un cordial saludo
Ramón
NOTA : Veo que eres de España! Si tienes contacto con empresas de Barcelona que requieran de los servicios de alguien con mi perfil, te estaría muy agradecida que me lo comunicases.
Ya que busco trabajo.
Pego la url tambien porque creo que es lo justo:
http://www.todoexpertos.com/categori...nnect-by-prior

Saludos
  #8 (permalink)  
Antiguo 08/07/2008, 10:45
 
Fecha de Ingreso: mayo-2005
Mensajes: 103
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: select recursivo

tengo el oracle 9. no entiendo mucho de los 'tokems'.
es como hacer que no sea sea recursiva, para evitar el loop.

gracias.
  #9 (permalink)  
Antiguo 09/07/2008, 01:33
Avatar de chuscazo  
Fecha de Ingreso: abril-2004
Mensajes: 84
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: select recursivo

No entiendo tu última respuesta, ¿todavía tienes algún problema?

Saludos
  #10 (permalink)  
Antiguo 09/07/2008, 13:48
 
Fecha de Ingreso: mayo-2005
Mensajes: 103
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: select recursivo

si, lo unico que me faltaria es evitar el loop que se genera. por que si condiciono por nivel funciona bien, pero se puede dar el caso que haya mas niveles.
  #11 (permalink)  
Antiguo 10/07/2008, 01:40
Avatar de chuscazo  
Fecha de Ingreso: abril-2004
Mensajes: 84
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: select recursivo

Hola,

La verdad que despues de re-leer lo que te pegue me parece que tu única solución es hacerlo por código.

Si lo que necesitas es que sea con una funcion de Oracle yo no te puedo ayudar mucho mas, lo unico que se me ocurre es que te pases por la url del tema que te pegue y preguntar allí directamente.

http://www.todoexpertos.com/categori...nnect-by-prior

Saludos y suerte
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:02.