Página 1 de 1

Búsqueda general en una base de datos

NotaPublicado: 2011-10-11 13:34 @607
por victorhugo
Buenas tardes,

Gracias por responder a las solicitudes. Bueno, el presente pedir su ayuda con un tema que que tiene maquinando. Yo tengo mi base de datos en PostgreSQL y estoy generando un script en el cual se necesita generar una consulta general. Voy con el ejemplo:

Se tiene una caja de texto donde se colocará por ejemplo víctor; este valor debe buscarlo en toda la base de datos. Tengo 10 tablas. He realizado consultas pero por tablas, ahora no sé cómo debería hacer este tipo de búsqueda, si por variables estáticas o libres.

En fin, es una confusión grande. Agradezco siempre su ayuda.

Re: Búsqueda general en una base de datos

NotaPublicado: 2011-10-11 15:51 @702
por explorer
Entiendo lo que puede ser una "variable estática", pero... no ahora no caigo qué es una "variable libre".

Re: Búsqueda general en una base de datos

NotaPublicado: 2011-10-13 08:27 @393
por victorhugo
No sé si esté mal mi concepto pero con variable libre me refiero a que no posee solo un tipo de dato. Lo más seguro es que no me supe explicar. En fin, la cuestión es realizar un query en PostgreSQL que permita buscar lo que se coloque en una determinada variable.

Ejemplo: en una caja de texto coloco "jorge" y este dato lo debe buscar en todas las tablas de la base de datos. Pero no sé cómo plantear esto.

Gracias por la respuesta y disculpen los términos equivocados.

Re: Búsqueda general en una base de datos

NotaPublicado: 2011-10-13 10:26 @476
por explorer
Yo creo que la solución es hacer un bucle por todas las tablas de la base de datos.

No conozco ninguna sentencia SQL que permita hacer una consulta a varias tablas a la vez. Quizás exista, pero yo no la conozco.

Re: Búsqueda general en una base de datos

NotaPublicado: 2011-10-15 07:15 @343
por pvaldes
Hombre, se podría tirar de JOIN y juntar algunas tablas relacionadas para analizarlas conjuntamente, pero parece más razonable hacer un bucle para todas las tablas.

Una solución realmente cutre, pero rápida y sucia que podría funcionar sería volcar toda la base de datos a un archivo de texto (suponiendo que su tamaño lo permita) y hacer una simple búsqueda de un patrón dentro de un fichero, algo realmente trivial con Perl, y muy rápido. Como digo es una cutrez, pero mientras encuentras algo mejor puede servir, igual hasta era más rápida que un montón de select tablaX corriendo sucesivamente.

Si aún así quieres hacerlo mediante SQL, sugeriría primero eliminar de la lista de tablas aquellas que no contengan el patrón a buscar, algo que puede hacerse simplemente sabiendo qué contiene esa tabla o usando un sencillo LIKE '%patron%' sobre la tabla. Eso probablemente facilitaría el código posterior.

Re: Búsqueda general en una base de datos

NotaPublicado: 2011-10-15 10:16 @469
por explorer
pvaldes escribiste:Hombre, se podría tirar de JOIN y juntar algunas tablas relacionadas para analizarlas conjuntamente
¿Cómo se haría con JOIN?

pvaldes escribiste:Una solución realmente cutre, pero rápida y sucia que podría funcionar sería volcar toda la base de datos a un archivo de texto (suponiendo que su tamaño lo permita) y hacer una simple búsqueda de un patrón dentro de un fichero, algo realmente trivial con Perl, y muy rápido. Como digo es una cutrez, pero mientras encuentras algo mejor puede servir, igual hasta era más rápida que un montón de select tablaX corriendo sucesivamente.
Lo dudo mucho...

pvaldes escribiste:Si aún así quieres hacerlo mediante SQL, sugeriría primero eliminar de la lista de tablas aquellas que no contengan el patrón a buscar, algo que puede hacerse simplemente sabiendo qué contiene esa tabla o usando un sencillo LIKE '%patron%' sobre la tabla. Eso probablemente facilitaría el código posterior.
... tardando lo mismo que si hacemos la operación de buscar por lo que queremos encontrar...

Re: Búsqueda general en una base de datos

NotaPublicado: 2011-10-15 15:00 @667
por pvaldes
explorer escribiste:¿Cómo se haría con JOIN?


Eso dependería de la estructura de nuestra base de datos

explorer escribiste: Lo dudo mucho...


bueno, es cierto que no contaríamos con la ventaja de los índices de la base de datos pero podríamos haber volcado selectivamente al fichero, filtrando los datos primero, y eso podría facilitar la cosa. En cualquier caso Perl es rápido procesando texto, todo depende del tiempo que se tarde en dar con la query adecuada.

explorer escribiste:... tardando lo mismo que si hacemos la operación de buscar por lo que queremos encontrar...


Eso es totalmente cierto.

Sería bueno tener en mente la idea de que Perl no buscará en TODAS las tablas de la base de datos en cualquier caso, especialmente en las de sistema. Seguramente sería bueno filtrar esas de algún modo. Todo lo que sea simplificar el código podría evitar problemas difíciles de arreglar a la larga con permisos, etc.

Re: Búsqueda general en una base de datos

NotaPublicado: 2011-10-16 09:25 @434
por explorer
pvaldes escribiste:Eso dependería de la estructura de nuestra base de datos
Supongamos lo que ha planteado victorhugo: una base de datos con diez tablas, que supondremos que se llaman A, B, C, D,... y todas las tablas tiene varios campos, pero solo nos interesa uno de ellos llamado 'nombre'. Y lo que queremos es encontrar todos los registros de todas las tablas cuyo 'nombre' sea 'víctor'. ¿Cómo se haría con JOIN?

pvaldes escribiste:bueno, es cierto que no contaríamos con la ventaja de los índices de la base de datos pero podríamos haber volcado selectivamente al fichero, filtrando los datos primero, y eso podría facilitar la cosa. En cualquier caso Perl es rápido procesando texto, todo depende del tiempo que se tarde en dar con la query adecuada.
En la inmensa mayor parte de las ocasiones, no es así. En mis 12 años de experiencia con Perl, solo en 1 ocasión tuve que hacer eso, pero era porque la base de datos no tenía los índices bien optimizados.

En todos los demás casos, el motor de la base de datos siempre es más rápido que bajar, filtrar y procesar por parte de Perl. Solo es cuestión de encontrar la sentencia SQL adecuada.

pvaldes escribiste:Sería bueno tener en mente la idea de que Perl no buscará en TODAS las tablas de la base de datos en cualquier caso, especialmente en las de sistema.
¿Tablas del sistema? ¿De qué estás hablando? Aquí se está planteando el caso de una aplicación de usuario de la que se supone que hay que sacar información de todas las tablas. Y nada más...

Re: Búsqueda general en una base de datos

NotaPublicado: 2011-10-20 09:24 @433
por victorhugo
Buenos días,

Gracias por su respuesta. Les informo sobre los avances. Logré hacer un JOIN. La función es así: (select tabla1.campo, tabla2.campo from tabla2 INNER JOIN tabla1 ON tabla1.campo2=tabla2.campo1). Se trae los campos name de cada tabla(10) y los unimos debido a su relación. Pero aunque las tablas están unidas por los id, aun así no he logrado construir una búsqueda general, debido a que no se está buscando dentro de cada tabla, simplemente se unen con el join porque necesito mostrarlo así en pantalla.

Lo que necesito que me ayuden es que me den una idea de cómo realizar esa búsqueda en cada tabla.

Gracias.

Re: Búsqueda general en una base de datos

NotaPublicado: 2011-10-20 09:54 @454
por explorer
Sí: con JOIN puedes sacar registros que están relacionados en diversas tablas.

Pero: no es eso lo que estás pidiendo. Lo que pides, o al menos es lo que yo te he entendido, es que quieres hacer una búsqueda de una información en todas las tablas.

Bueno, primero debes saber qué tablas son. Con un comando como SHOW TABLES; obtienes esa lista.

Luego, en el programa, solo tienes que hacer un bucle que recorra esa lista, ejecutando el SELECT correspondiente, en cada una de ellas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $table (@tables) {
  2.     my $sth = $dbh->prepare("SELECT * FROM $table WHERE id=?");
  3.  
  4.     $sth->execute('lo-que-buscamos');
  5.  
  6.     # mostrar resultados
  7. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4