• Publicidad

Búsqueda general en una base de datos

Todo acerca de las bases de datos que existen: SQL, MySQL, Oracle, Postgres, CSV, etc.

Búsqueda general en una base de datos

Notapor victorhugo » 2011-10-11 13:34 @607

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.
VHMR
victorhugo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-05-04 10:01 @459

Publicidad

Re: Búsqueda general en una base de datos

Notapor explorer » 2011-10-11 15:51 @702

Entiendo lo que puede ser una "variable estática", pero... no ahora no caigo qué es una "variable libre".
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Búsqueda general en una base de datos

Notapor victorhugo » 2011-10-13 08:27 @393

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.
VHMR
victorhugo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-05-04 10:01 @459

Re: Búsqueda general en una base de datos

Notapor explorer » 2011-10-13 10:26 @476

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Búsqueda general en una base de datos

Notapor pvaldes » 2011-10-15 07:15 @343

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.
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Búsqueda general en una base de datos

Notapor explorer » 2011-10-15 10:16 @469

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...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Búsqueda general en una base de datos

Notapor pvaldes » 2011-10-15 15:00 @667

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.
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Búsqueda general en una base de datos

Notapor explorer » 2011-10-16 09:25 @434

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...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Búsqueda general en una base de datos

Notapor victorhugo » 2011-10-20 09:24 @433

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.
VHMR
victorhugo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-05-04 10:01 @459

Re: Búsqueda general en una base de datos

Notapor explorer » 2011-10-20 09:54 @454

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
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Bases de datos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados