PDA

Ver la Versión Completa : consulta a varias bases de datos


carlos gonzalez
03-10-2007, 00:31:43
Hola amigos tengo una duda.

Alguien sabe si es posible hacer una consulta a varias bases de datos.

Es decir tengo una aplicacion desarrollada en delphi7 y por medio de DBEXPRES me conecto a una base de datos de DB2 pero nesecito cruzar una tabla de db2 con otra de interbase.

Alguien sabe si es posible hacer esto.

Saludos....

poliburro
03-10-2007, 01:07:21
mmm, Eso es posible con MsSql server y se le llama Servidores vínculados.

Deberías considerar pasarte a MsSql.

Suerte

Neftali [Germán.Estévez]
03-10-2007, 09:59:22
La verdad es que entre BD del mismo puede haber alguna opción, pero entre dos Bases de datos distintas, me parece muy, pero que muy difícil.

jhonny
03-10-2007, 15:10:55
Bueno, con dbexpress nos podemos conectar a varias bases de datos, llamese MySQL, DB2, Interbase, SQLServer, Oracle... no creo que puedas hacer un "select bdDB2.Codigo, bdInterbase.Descripcion from ...", pero si quieres algo preciso podrias implementarlo en tu aplicación...

Supongamos que quieres los datos que coincidan entre una tabla que esta en la BD de DB2, con los datos de una tabla que esta en la BD de Interbase... con un par de TSQLConnection, apuntando cada uno a su respectiva BD se podria lograr dicho efecto :).

Neftali [Germán.Estévez]
03-10-2007, 16:03:09
... con un par de TSQLConnection, apuntando cada uno a su respectiva BD se podria lograr dicho efecto.

¿Con una sóla consulta se podría logar eso?
¿Puedes explicar cómo Jonnhy?

jhonny
03-10-2007, 16:27:37
¿Con una sóla consulta se podría logar eso?
¿Puedes explicar cómo Jonnhy?

No, seguro me hice entender mal... aunque de hecho escribi:

no creo que puedas hacer un "select bdDB2.Codigo, bdInterbase.Descripcion from ..."

Seguro el mal entendido lo he causado con la siguiente frase:

pero si quieres algo preciso podrias implementarlo en tu aplicación...

Nunca he logrado hacer eso con una sola consulta, lo que si he logrado es traer los datos que coinciden entre una tabla de una BD, con los de una tabla de otra BD (de distintos motores), pero para eso he tenido que traer dos TSQLConnection apuntando cada uno a su respectiva base de datos y luego examinar los datos por medio de sus TDataSets (Respetivamente conectados), con una cantidad de "chapuserias" como locate y esas cosas... logrando asi el "efecto" deseado, pero de hacer todo eso con una sola consulta... pues sería estupendo poderlo hacer y si supiera hacerlo no duden en que ya les hubiera dicho como es la cosa :D.

P.D. En todo caso, disculpas por el mal entendido.

Neftali [Germán.Estévez]
03-10-2007, 17:17:45
Ok, aclarado...:D:D

poliburro
03-10-2007, 23:12:43
No, seguro me hice entender mal... aunque de hecho escribi:



Seguro el mal entendido lo he causado con la siguiente frase:



Nunca he logrado hacer eso con una sola consulta, lo que si he logrado es traer los datos que coinciden entre una tabla de una BD, con los de una tabla de otra BD (de distintos motores), pero para eso he tenido que traer dos TSQLConnection apuntando cada uno a su respectiva base de datos y luego examinar los datos por medio de sus TDataSets (Respetivamente conectados), con una cantidad de "chapuserias" como locate y esas cosas... logrando asi el "efecto" deseado, pero de hacer todo eso con una sola consulta... pues sería estupendo poderlo hacer y si supiera hacerlo no duden en que ya les hubiera dicho como es la cosa :D.

P.D. En todo caso, disculpas por el mal entendido.



Precisamente por eso me gusta tanto MsSql, Pues en ese motor es posible hacer algo como lo siguiente:


Select *
From MsSql.Dbo.Tabla As Tabla1
Inner join Db2.Tabla As Tabla2
On Tabla.Clave = Tabla2.Clave
Inner join Mysql.Tabla As Tabla3
On Tabla.Clave = Tabla3.Clave
Inner join FireBird.Tabla As Tabla4
On Tabla.Clave = Tabla3.Clave


:P, chulada lo de los servidores vinculados en MsSql.

jhonny
03-10-2007, 23:20:26
Precisamente por eso me gusta tanto MsSql, Pues en ese motor es posible hacer algo como lo siguiente:


Select *
From MsSql.Dbo.Tabla As Tabla1
Inner join Db2.Tabla As Tabla2
On Tabla.Clave = Tabla2.Clave
Inner join Mysql.Tabla As Tabla3
On Tabla.Clave = Tabla3.Clave
Inner join FireBird.Tabla As Tabla4
On Tabla.Clave = Tabla3.Clave


:P, chulada lo de los servidores vinculados en MsSql.


¿¿¿Ahh si??? :eek:, buenisimo, ¿Sabes si con Oracle se podra hacer tambien?

poliburro
03-10-2007, 23:46:20
mmm, De oracle no me considero experto, por lo que no podría asegurarte nada. Pero de lo que si estoy seguro es que puedes vincular servidores diferentes aún siendo versiones distintas.

En mi caso específico tengo un database link (que así se llama en oracle) entre oracle 10G express y Oracle 8i Standard.

jhonny
04-10-2007, 00:20:30
Aún asi tambien esta interesante, supongo que tambien debe haber una forma de hacerlo en oracle :)

poliburro
04-10-2007, 00:33:22
Aún asi tambien esta interesante, supongo que tambien debe haber una forma de hacerlo en oracle :)

concuerdo contigo, puesto que oracle es un motor mucho más potente que Sql Server.

Neftali [Germán.Estévez]
04-10-2007, 11:49:15
Sabía lo que son los "Linked Servers" en SQL Server e incluso alguna vez los he utilizado (no mucho por temas de que son muy lentos, aunque cuando no hay más remedio...:()
Lo que no sabía (gracias Poliburro) es que se podían vincular vía OLEDB otros servidorres que no fueran tipo "SQL Server".:D:D:D

rolandoj
04-10-2007, 19:51:41
Hola,

Las consultas multimotor son una de la facilidades del BDE que se han perdido en dbExpress.

Para tú caso particular, esta solución puede ser mejor, ya que no depende de involucrar otro motor.

Con BDE, se pueden hacer estas consultas mediante SQL Local usando como puente una "Base de datos" PARADOX (para forzar a SQL Local); que es simplemente un directorio vacio al que se asocia un Alias BDE. La consulta puede hacerse entre varios motores, incluso sin involucrar tablas de la "Base de Datos" que se usa como puente.

Esto es lo que se conoce como "Uniones Heterogeneas". He aquí un ejemplo:


Select A.NOMBRE,A.CODIGO,B.CODIGO
FROM ":ALIASINT:TABLA1" A,":ALIASORA:TABLA2"
WHERE A.NOMBRE = B.NOMBRE


El nombre de la tabla se prefija mediante un Alias BDE, encerrado entre dos puntos, y todo se encierra entre doble comilla.

Para mayor información pueden consultar el archivo localsql.hlp del directorio de instalación del BDE. Simplemente en el índice escriban "heterogeneous join"

Quisiera agregar que este es un mecanismo muy útil cuando se está en proceso de depuración de datos (por ejemplo, usando el SQL Explorer); pero, aunque por rendimiento de la aplicación y unicidad de datos puede ser necesario hacerlo, metodológicamente no es recomendable usar esta técnica en un programa por el control que debe hacerse de cada conexión a Bases de Datos.