Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Otros Temas » Bases de Datos » Búsqueda general en una base de datos Responder al tema
Nuevo tema


Página 1 de 1  [ 10 mensajes ] 
 
Nota 2011-10-11 13:34 @607

Perlero Nuevo
Registrado: 2011-05-04 10:01 @459
Mensajes: 17
Búsqueda general en una base de datos
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


Nota 2011-10-11 15:51 @702
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Búsqueda general en una base de datos
Entiendo lo que puede ser una "variable estática", pero... no ahora no caigo qué es una "variable libre".

_________________
JF^D Perl programming


Nota 2011-10-13 08:27 @393

Perlero Nuevo
Registrado: 2011-05-04 10:01 @459
Mensajes: 17
Re: Búsqueda general en una base de datos
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


Nota 2011-10-13 10:26 @476
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Búsqueda general en una base de datos
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


Nota 2011-10-15 07:15 @343

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: Búsqueda general en una base de datos
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.


Nota 2011-10-15 10:16 @469
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Búsqueda general en una base de datos
pvaldes escribió:
Hombre, se podría tirar de JOIN y juntar algunas tablas relacionadas para analizarlas conjuntamente
¿Cómo se haría con JOIN?

pvaldes escribió:
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 escribió:
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


Nota 2011-10-15 15:00 @667

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: Búsqueda general en una base de datos
explorer escribió:
¿Cómo se haría con JOIN?


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

explorer escribió:
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 escribió:
... 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.


Nota 2011-10-16 09:25 @434
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Búsqueda general en una base de datos
pvaldes escribió:
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 escribió:
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 escribió:
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


Nota 2011-10-20 09:24 @433

Perlero Nuevo
Registrado: 2011-05-04 10:01 @459
Mensajes: 17
Re: Búsqueda general en una base de datos
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


Nota 2011-10-20 09:54 @454
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10216
Re: Búsqueda general en una base de datos
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:
Syntax: [ Download ] [ Hide ]
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. }

_________________
JF^D Perl programming


Responder al tema  [ 10 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO