Un comando del Firebird que puede resultarnos muy útil en ciertas ocasiones es el MERGE. Éste nos permite insertar o actualizar las filas de una tabla de acuerdo al contenido de otra tabla.

Sintaxis:

MERGE INTO
   {Tabla1 | Vista1} [[AS] alias1]
USING
   {Tabla2 | Vista2 | (instrucción_SELECT)} [[AS] alias2]
ON 
   Condición
WHEN MATCHED THEN
   UPDATE 
      SET Columna1 = Valor1 [, Columna2 = Valor2...]
WHEN NOT MATCHED THEN 
   INSERT 
      [(<Columnas>)] VALUES (<valores>)

Podemos usar WHEN MATCHED y WHEN NOT MATCHED o solamente uno de ellos.

Ejemplo:

Tenemos una tabla llamada CLIENTES y otra tabla llamada PROSPECTOS. Los prospectos son los clientes potenciales, aquellos que quizás sí o quizás no lleguen a ser nuestros clientes. Mientras la venta no esté confirmada son prospectos o sea posibles clientes. Pero cuando confirmamos la venta entonces ya pasan a ser clientes, ya no son prospectos porque la venta ya se realizó.

En la tabla de PROSPECTOS tenemos registrados los datos de nuestros posibles futuros clientes, como sus nombres, direcciones, números de teléfono, e-mails, etc. Cuando la venta se confirma y por lo tanto pasan a ser clientes confirmados queremos copiar esos datos que están en la tabla de PROSPECTOS a la tabla de CLIENTES, para no tener que volver a escribir los mismos datos que ya teníamos cargados.

MERGE01

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

MERGE02

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

MERGE03

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

En la Captura 1. vemos la estructura de la tabla PROSPECTOS, en la Captura 2. vemos a nuestros posibles futuros clientes, y en la Captura 3. vemos a los clientes que tenemos actualmente.

En nuestra tabla de PROSPECTOS ya hemos confirmado la venta a quienes tienen una letra ‘T’ en la columna PRO_CONFIR, por lo tanto debemos pasar sus datos a la tabla de CLIENTES.

Eso lo conseguiremos fácilmente escribiendo:

MERGE INTO
   CLIENTES
USING
   PROSPECTOS
ON
   PRO_CONFIR = 'F'
WHEN NOT MATCHED THEN
   INSERT
          (CLI_IDENTI, CLI_NOMBRE, CLI_DIRECC, CLI_TELEFO, CLI_EMAILX)
   VALUES (0 , PRO_NOMBRE, PRO_DIRECC, PRO_TELEFO, PRO_EMAILX)

Notarás que para hacer un INSERT tenemos que poner la condición contraria, porque el INSERT se realiza cuando la condición no se cumple. Cuando se cumple la condición se realiza un UPDATE (que en este ejemplo no hemos utilizado).

MERGE04

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

Ahora en nuestra tabla de CLIENTES ya tenemos a los prospectos a quienes les habíamos vendido y por lo tanto ya dejaron de ser prospectos y pasaron a ser clientes.

El último paso que nos queda por completar es eliminar de la tabla de PROSPECTOS aquellos que tienen una letra ‘T’ en la columa PRO_CONFIR porque después de pasarlos a la tabla de CLIENTES ya no son prospectos y no deberían estar ahí.

DELETE FROM
   PROSPECTOS
WHERE
   PRO_CONFIR = 'T'

MERGE05

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

Conclusión:

Para poder copiar datos de una tabla, vista o instrucción SELECT a otra tabla o vista el Firebird dispone del comando MERGE, en el cual debemos elegir:

  1. la tabla o la vista que recibirá los datos
  2. la tabla, vista, o SELECT de la cual extraeremos los datos
  3. la condición para que una fila sea insertada o actualizada

Si la condición elegida se cumple, entonces se realizará un UPDATE. Si la condición elegida no se cumple, entonces se realizará un INSERT.

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

Anuncios