Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/02/2011, 01:45
Avatar de huspy
huspy
 
Fecha de Ingreso: diciembre-2008
Ubicación: Málaga, España
Mensajes: 120
Antigüedad: 16 años
Puntos: 2
SQL engorrosa

Buenas!

Estoy trabajando en un programa en Java e intentando hacer una select un poco compleja (por lo menos para mí jeje) a ver si me podéis echar una mano.



Tengo 2 tablas, una de directorios y otra de documentos. Tanto los documentos como los directorios "cuelgan" de otros directorios, es decir los directorios hacen referencia a sí mismos y los documentos también tiene una clave foránea a los directorios. Además en cada directorio se guarda el nivel al que pertenece, es decir, para el directorio raíz (que es único) el nivel es el 1, para los que cuelguen de él tendrán el nivel 2 y así sucesivamente...

En la aplicación debo mostrar un árbol que contengan los directorios y en la parte derecha una tabla con un listado de los documentos de cada directorio seleccionado en cada momento en el árbol.

Para ello lo que estoy intentando hacer con la select es obtener los documentos y además los directorios a los que pertenecen, pero recursivamente, me explico gráficamente:


Código SQL:
Ver original
  1. DIR_DIRECTORIO
  2. dir_pk    dir_dir_pk        dir_nombre            dir_nivel
  3. 1            NULL                directorio_raíz        1
  4. 2            1                    directorio1                2
  5. 3            1                    directorio2                2
  6. 4            2                    directorio3                3
  7. 5            4                    directorio4                4
  8.  
  9.  
  10. DOC_DOCUMENTO
  11. doc_pk        dir_pk        doc_nombre
  12. 1                2                documento1
  13. 2                4                documento2
  14. 3                4                documento3
  15. 4                5                documento4
  16. 5                3                documento5


Entonces teniendo estas tablas con dichos datos tendría que sacar todos los directorios y sus carpetas hasta llegar al nivel superior (aunque solo sepa el padre y no el abuelo en la jerarquía). Me explio? :)

Actualmente la select que he formado es la siguiente, pero me parece una guarrería... porque tengo que ir formando mediante un bucle en java lo que indico en rojo dependiendo por cada nivel que exista en la jerarquía de directorios:

Código SQL:
Ver original
  1. SELECT dir.dir_pk, dir.dir_dir_pk, dir.dir_nivel, dir.dir_nombre,
  2. dir1.dir_pk, dir1.dir_dir_pk, dir1.dir_nivel, dir1.dir_nombre,
  3. dir2.dir_pk, dir2.dir_dir_pk, dir2.dir_nivel, dir2.dir_nombre,
  4. dir3.dir_pk, dir3.dir_dir_pk, dir3.dir_nivel, dir3.dir_nombre,
  5. doc.doc_pk, doc.doc_nombre
  6.  
  7. FROM dir_directorio dir
  8. LEFT JOIN dir_directorio dir1 ON dir.dir_dir_pk = dir1.dir_pk
  9. LEFT JOIN dir_directorio dir2 ON dir1.dir_dir_pk = dir2.dir_pk
  10. LEFT JOIN dir_directorio dir3 ON dir2.dir_dir_pk = dir3.dir_pk
  11. LEFT JOIN doc_documento doc ON dir.dir_pk = doc.dir_pk;

En realidad esto me prodría servir, pero como he dicho me parece bastante deo y no se de verdad si hay alguna manera mejor y más limpia de hacerlo

Esto lo que me devolvería sería:


Código SQL:
Ver original
  1. dir_pk1        dir_dir_pk1        dir_nivel1        dir_nombre1            dir_pk2        dir_dir_pk2        dir_nivel2            dir_nombre2        dir_pk3        ir_dir_pk3        dir_nivel3            dir_nombre3        doc_pk        doc_nombre
  2. 1                NULL                    1                    directorio_raiz        NULL            NULL                    NULL                    NULL                    NULL            NULL                NULL                    NULL                    1                documento1
  3. 2                1                        2                    directorio1                1                NULL                    1                        directorio_raiz    NULL            NULL                NULL                    NULL                    2                documento2
  4. 2                1                        2                    directorio1                1                NULL                    1                        directorio_raiz    NULL            NULL                NULL                    NULL                    3                documento3
  5. 4                2                        3                    directorio3                2                1                        2                        directorio1            1                NULL                1                        directorio_raiz    4                documento4
  6. 1                NULL                    1                    directorio_raiz        NULL            NULL                    NULL                    NULL                    NULL            NULL                NULL                    NULL                    5                documento5

Bueno espero me puedan ayudar un poco en esto.

Muchas Gracias por todo y Saludos!!
__________________
"Lo escuché y lo olvidé, lo vi y lo entendí, lo hice y lo aprendí." (Confucio)