A veces necesitamos realizar consultas que involucren a dos (o más) tablas que se encuentran en dos (o más) bases de datos diferentes.

Ejemplo:

En la «Casa Central» tenemos una Base de Datos que tiene una tabla de CLIENTES y en la «Sucursal 1» tenemos otra Base de Datos que tiene otra tabla de CLIENTES. No podemos tener una Base de Datos única porque la conexión con Internet no es constante, sufre de frecuentes cortes, por lo tanto optamos por tener dos bases de datos, independientes, cada una con sus propios datos.

Pero a veces es necesario reunir en una sola consulta los nombres de los clientes que se encuentran en la «Casa Central» y en la «Sucursal 1».

En este momento, estos son algunos de los clientes que tenemos en la «Casa Central»

CONSULTAS1

Captura 1. Si haces clic en la imagen la verás más grande

Y estos son algunos de los clientes que tenemos en la «Sucursal 1»:

CONSULTAS2

Captura 2. Si haces clic en la imagen la verás más grande

Que como puedes ver los nombre son distintos, aunque algunos identificadores se repiten.

Para tener en una sola consulta los nombres de los clientes de la «Casa Central» y de la «Sucursal 1» escribimos este stored procedure:

CREATE PROCEDURE CONSULTAR_2_BASES
   RETURNS(
   ftnCodSuc TYPE OF COLUMN CLIENTES.CLI_CODSUC,
   ftnIdenti TYPE OF COLUMN CLIENTES.CLI_IDENTI,
   ftcNombre TYPE OF COLUMN CLIENTES.CLI_NOMBRE)
AS
   DECLARE VARIABLE lcComando VARCHAR(200);
BEGIN

   lcComando = 'SELECT CLI_CODSUC, CLI_IDENTI, CLI_NOMBRE FROM CLIENTES';

   FOR EXECUTE STATEMENT
      lcComando
   ON EXTERNAL
      'E:\SQL\SQL_CONTA\DATABASES\ERP2000.FDB'
   AS
      USER 'SYSDBA'
      PASSWORD 'masterkey'
   INTO
      :ftnCodSuc,
      :ftnIdenti,
      :ftcNombre
   DO
      SUSPEND;

   FOR SELECT
      CLI_CODSUC,
      CLI_IDENTI,
      CLI_NOMBRE
   FROM
      CLIENTES
   INTO
      :ftnCodSuc,
      :ftnIdenti,
      :ftcNombre
   DO
      SUSPEND;

   END;

Y esto es lo que observamos (luego de hacer clic sobre la columna ftnIdenti) para que las filas queden ordenadas:

CONSULTAS3

Captura 3. Si haces clic en la imagen la verás más grande

Como puedes ver algunos identificadores están repetidos pero eso no es problema porque podemos diferenciarlos mediante la columna CLI_CODSUC (código de la Sucursal). Un valor de 0 en esa columna significa «Casa Central» y un valor de 1 significa «Sucursal 1».

Pero ¿y si esta consulta se repetirá varias veces durante el día? ¿o si queremos verla ordenada por Identificador o por Nombre del Cliente?

Estar ejecutando el stored procedure CONSULTAR_2_BASES cada vez que se requiere ver los datos de todos los clientes es impráctico porque las consultas a las bases de datos externas son más lentas. Entonces ¿cuál es la solución?

Crear una tabla temporal (una tabla GTT) y guardar en ella cada fila que nos devuelve el stored procedure CONSULTAR_2_BASES, de esa manera tendremos una gran velocidad. O sea, la primera consulta será lenta (porque deberá traer los datos de una Base de Datos externa e insertar esas filas, más las filas de la tabla local, en una tabla GTT) pero las demás consultas serán rapidísimas.

Conclusión:

Es perfectamente posible con Firebird consultar tablas que se encuentran en bases de datos externas. Y si esas consultas se repetirán varias veces durante el día o si necesitamos tener a las filas ordenadas por algún criterio lo más aconsejable es realizarlas una sola vez y guardar el resultado en una tabla GTT, al ser la tabla GTT una tabla local las consultas a ella son rapidísimas y como toda tabla podemos ordenarla según cualquier criterio que nos parezca.

Por supuesto que las consultas a las bases de datos externas pueden involucrar a muchas tablas y a muchas bases de datos, no tienen por que ser solamente 2, como se mostró en este ejemplo.

Artículos relacionados:

Creando y usando tablas temporales

El índice del blog Firebird21