2011-04-27 58 views
6

"Fun" con referencias cíclicos:SQL SELECT para buscar referencias cíclicas en el árbol padre-ID-organizado?

Supongamos que tiene un elementos de la tabla que contienen una jerarquía de elementos, modelado por un ID padre.

El campo ID de padre es nulo para la raíz.

Todos los demás registros tienen un Id. De padre no nulo con la clave principal (autosecuenciada) (ID) del elemento padre.

Por ejemplo, el uso de

SELECT * 
FROM Elements 
WHERE FATHER_ID not in (SELECT ID FROM Elements) 

puedo encontrar todos los elementos que tienen referencias padre inválido (FATHER_ID no es una clave externa, vamos a suponer que en este ejemplo).

Pero, ¿cómo puedo encontrar elementos que tengan una referencia padre válida PERO cuya cadena de referencias padre no termina en la raíz? Creo que esto solo puede ocurrir para referencias cíclicas, por ejemplo, A es el padre de B, pero B también es el padre de A. Tal "subárbol" no está vinculado a la raíz y, por lo tanto, no es parte del árbol principal. Quiero encontrar esos subárboles.

Por supuesto, estoy buscando una consulta que proporcione los elementos que conducen a una referencia cíclica sin importar cuánto tiempo la cadena de referencias pueda ser.

¿Es eso posible en SQL, o necesito una solución iterativa?

Respuesta

5
SELECT n.*, CONNECT_BY_ROOT(id), level 
FROM elements n 
START WITH 
     id IN 
     (
     SELECT MIN(id) 
     FROM (
       SELECT id, CONNECT_BY_ROOT(id) AS root 
       FROM elements 
       START WITH 
         id IN 
         (
         SELECT id 
         FROM elements n 
         WHERE CONNECT_BY_ISCYCLE = 1 
         CONNECT BY NOCYCLE 
           father_id = PRIOR id 
         ) 
       CONNECT BY NOCYCLE 
         id = PRIOR father_id 
       ) 
     GROUP BY 
       root 
     ) 
CONNECT BY NOCYCLE 
     id = PRIOR father_id 

Es posible que desee leer este artículo:

+0

+1 para el uso de CONNECT BY. Hay todo tipo de cosas geniales que puede hacer con datos jerárquicos. Tenga en cuenta que es solo Oracle. En 11gR2 agregaron la cláusula recursiva de factorización de subconsulta (http://technology.amis.nl/blog/6104/oracle-rdbms-11gr2-goodbye-connect-by-or-the-end-of-hierarchical-querying-as- lo sabemos) –

+0

Oha. Eso parece algo para batirse y valer la pena. Gracias. – TheBlastOne

Cuestiones relacionadas