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

SQL engorrosa

Estas en el tema de SQL engorrosa en el foro de Bases de Datos General en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 01/02/2011, 01:45
Avatar de huspy  
Fecha de Ingreso: diciembre-2008
Ubicación: Málaga, España
Mensajes: 120
Antigüedad: 15 años, 4 meses
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)
  #2 (permalink)  
Antiguo 02/02/2011, 05:23
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: SQL engorrosa

Para construir esa query necesitas consultar primero el nivel del directorio donde esta el documento

SELECT dir.nivel FROM documento doc
INNER JOIN directorios dir on doc.idDir=dir.diDir WHERE doc.idDoc=X

y luego hacer un bucle para construirla y finalmente ejecutarla.

Se me ocurre que quizas sea mas rapido hacer lo siguiente

SELECT * FROM directorios

obtienes todos los directorios y guardas el resultado en un array

Luego

SELECT * FROM documento doc
INNER JOIN directorios dir on doc.idDir=dir.diDir WHERE doc.idDoc=X

(para un doc o sin el WHERE para todos)

con lo que obtienes los datos del documento y de su directorio, con ellos montas el bucle sobre el array de directorios para obtener el arbol.

Estas son consultas muy simples para el servidor de bbdd y ademas la primera la ejecutas una sola vez (mientras no haya cambios en el arbol de directorios). El bucle sobre el array será mas o menos dificil de programar pero una vez hecho seguramente será mas eficiente que una query con n niveles de recursividad.

No se es una idea....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 02/02/2011 a las 05:36

Etiquetas: sql
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 05:47.