# Merge

El prefijo Merge se puede añadir a cualquier sentencia LOAD o SELECT en el script para especificar que la tabla cargada debe fusionarse en otra tabla. También especifica que esta sentencia debe ejecutarse en una carga parcial.

El caso de uso típico es cuando carga un registro de cambios y desea usarlo para aplicar inserts, updates, y deletes a una tabla existente.

Nota informativaPara que la carga parcial funcione correctamente, la app debe abrirse con datos antes de que se active una carga parcial.

Realice una carga parcial con el botón Cargar. Para más información, vea [Botón](https://help.qlik.com/es-ES/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Visualizations/Button/button.htm). También puede usar Qlik Engine JSON API.

Sintaxis:

Merge [only] [(SequenceNoField [, SequenceNoVar])] On ListOfKeys [Concatenate [(TableName)]] (loadstatement | selectstatement)

Argumentos:

Argumentos

| Argumento | Descripción |
| --- | --- |
| only | Un cualificador opcional que indica que la sentencia solo debe ejecutarse durante las cargas parciales. La sentencia se ignora durante las cargas normales (no parciales). |
| SequenceNoField | El nombre del campo que contiene una fecha-hora o un número de secuencia que define el orden de las operaciones. |
| SequenceNoVar | El nombre de la variable a la que se le asigna el valor máximo de SequenceNoField de la tabla que se fusiona. |
| ListOfKeys | Una lista de nombres de campo separados por comas que especifican la clave principal. |
| Operation | El primer campo de la sentencia de carga debe contener la siguiente operación como una cadena de texto: "Insert", "Update" o "Delete". También se aceptan: "i", "u" y "d". |

## Funcionalidad general

Durante una carga normal (no parcial), la construcción Merge LOAD funciona como una sentencia Load normal, pero con la funcionalidad adicional de eliminar registros obsoletos más antiguos y registros marcados para su eliminación. El primer campo de la sentencia Load debe contener información sobre la operación: Insert, Update o Delete.

Para cada registro cargado, el identificador de registro se compara con los registros cargados previamente y solo se mantendrá el último registro (según el número de secuencia). Si el último registro está marcado con Delete, no se conservará ninguno.

### Tabla destino

La tabla que se ha de modificar viene determinada por el conjunto de campos. Si ya existe una tabla con el mismo conjunto de campos (excepto el primer campo; la operación), esta será la tabla relevante para modificar. Alternativamente, se puede usar un prefijo Concatenate para especificar la tabla. Si no se determina la tabla de destino, el resultado de la construcción Merge LOAD se almacena en una nueva tabla.

Si se usa el prefijo Concatenate, la tabla resultante tiene un conjunto de campos correspondientes a la unión de la tabla existente y la entrada a la fusión. Por lo tanto, la tabla de destino puede obtener más campos que el registro de cambios que se usa como entrada para la fusión.

Una carga parcial hace lo mismo que una carga completa. Con la diferencia de que una carga parcial rara vez crea una nueva tabla. A menos que haya utilizado la cláusula Only, siempre existe una tabla de destino con el mismo conjunto de campos de la ejecución del script anterior.

### Número de secuencia

El registro de cambios cargado es un registro acumulado, es decir, contiene cambios que ya se han cargado, el parámetro SequenceNoVar se puede utilizar en una cláusula Where para limitar la cantidad de datos de entrada. Se podría hacer luego que el Merge LOAD cargue solo registros en los que el campo SequenceNoField sea mayor que SequenceNoVar. Al finalizar, Merge LOAD asigna un nuevo valor al SequenceNoVar con el valor máximo que se ve en el campo SequenceNoField.

### Operaciones

La instrucción Merge LOAD puede tener menos campos que la tabla de destino. Las diferentes operaciones tratan los campos faltantes de manera diferente:

Insert: los campos que faltan en Merge LOAD, pero que existen en la tabla de destino, obtienen un NULL en la tabla de destino.

Delete: los campos que faltan no afectan al resultado. Los registros relevantes se eliminan de todos modos.

Update: los campos listados en Merge LOAD se actualizan en la tabla de destino. Los campos que faltan no se modifican. Esto significa que las dos instrucciones siguientes no son idénticas:

* Merge on Key Concatenate Load 'U' as Operation, Key, F1, Null() as F2 From ...;
* Merge on Key Concatenate Load 'U' as Operation, Key, F1 From ...;

La primera instrucción actualiza los registros enumerados y cambia F2 a NULL. La segunda no cambia F2, sino que deja los valores en la tabla de destino.

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Merge.htm)

#### Ejemplos

## Ejemplo 1: fusión simple con la tabla especificada

En este ejemplo, se carga una tabla inline denominada Persons, con tres filas. Merge luego cambia la tabla de la siguiente manera:

* Añade la fila Mary, 4.
* Elimina la fila Steven, 3.
* Asigna el número 5 a Jake.

La variable LastChangeDate se establece en el valor máximo en la columna ChangeDate después de que se ejecute Merge.

### Script de carga

Agregue el script de ejemplo en su app y ejecútelo. Para ver el resultado, agregue los campos enumerados en la columna de resultados a una hoja de su app.

```
Set DateFormat='D/M/YYYY';
Persons:
load * inline [
Name, Number
Jake, 3
Jill, 2
Steven, 3
];

Merge (ChangeDate, LastChangeDate) on Name Concatenate(Persons)
LOAD * inline [
Operation, ChangeDate,   Name,     Number
Insert,    1/1/2021,     Mary,     4
Delete,    1/1/2021,     Steven, 
Update,    2/1/2021,     Jake,     5
];
```

Para más información sobre el uso de cargas inline, vea [Usar cargas inline para cargar datos](https://help.qlik.com/es-ES/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/inline-loads-qs.htm).

### Resultado

Antes del Merge Load, la tabla resultante aparece de la siguiente manera:

Resulting table

| Name | Number |
| --- | --- |
| Jake | 3 |
| Jill | 2 |
| Steven | 3 |

Después de la carga de Merge Load, la tabla aparece de la siguiente manera:

Resulting table

| ChangeDate | Name | Number |
| --- | --- | --- |
| 2/1/2021 | Jake | 5 |
| - | Jill | 2 |
| 1/1/2021 | Mary | 4 |

Cuando se cargan los datos, el cuadro de diálogo Progreso de la carga de datos muestra las operaciones que se realizan:

El cuadro de diálogo de progreso de carga de datos

![El cuadro de diálogo de progreso de la carga de datos.](https://help.qlik.com/es-ES/sense/November2025/Subsystems/Hub/Content/Resources/Images/ui_gen_data_load_merge.png)

## Ejemplo 2: script de carga de datos con campos que faltan

En este ejemplo, se cargan los mismos datos que arriba, pero ahora con una identificación para cada persona.

Merge cambia la tabla de la siguiente manera:

* Añade la fila Mary, 4.
* Elimina la fila Steven, 3.
* Asigna el número 5 a Jake.
* Asigna el número 6 a Jill.

### Script de carga

Aquí utilizamos dos instrucciones Merge Load, una para "Insertar" y "Eliminar", y otra para "Actualizar".

Agregue el script de ejemplo en su app y ejecútelo. Para ver el resultado, agregue los campos enumerados en la columna de resultados a una hoja de su app.

```
Set DateFormat='D/M/YYYY';
Persons:
Load * Inline [
PersonID, Name, Number
1, Jake, 3
2, Jill, 2
3, Steven, 3
];

Merge (ChangeDate, LastChangeDate) on PersonID Concatenate(Persons)
Load * Inline [
Operation, ChangeDate,   PersonID, Name,     Number
Insert,    1/1/2021,     4,        Mary,     4
Delete,    1/1/2021,     3,        Steven, 
];

Merge (ChangeDate, LastChangeDate) on PersonID Concatenate(Persons)
Load * Inline [
Operation, ChangeDate,   PersonID, Number
Update,    2/1/2021,     1,        5
Update,    3/1/2021,     2,        6
];
```

### Resultado

Después de la carga de Merge Load, la tabla aparece de la siguiente manera:

Resulting table

| PersonID | ChangeDate | Name | Number |
| --- | --- | --- | --- |
| 1 | 2/1/2021 | Jake | 5 |
| 2 | 3/1/2021 | Jill | 6 |
| 4 | 1/1/2021 | Mary | 4 |

Tenga en cuenta que la segunda instrucción Merge no incluye el campo Name y, como consecuencia, los nombres no han cambiado.

## Ejemplo 3: script de carga de datos: carga parcial mediante una cláusula Where con ChangeDate

En el ejemplo siguiente, el argumento Only especifica que el comando Merge solo se ejecutará durante una carga parcial. Las actualizaciones se filtrarán en función del LastChangeDate capturado previamente. Una vez que Merge haya finalizado, a la variable LastChangeDate se le asignará el valor máximo de la columna ChangeDate procesada durante la fusión.

### Script de carga

```
Merge Only (ChangeDate, LastChangeDate) on Name Concatenate(Persons)
LOAD Operation, ChangeDate,  Name, Number 
from [lib://ChangeFilesFolder/BulkChangesInPersonsTable.csv] (txt)
where ChangeDate >='$(LastChangeDate)';
```

## Más información

* [Carga parcial](https://help.qlik.com/es-ES/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/PartialReload.htm)
* [Load](https://help.qlik.com/es-ES/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Load.htm)
* [Concatenate](https://help.qlik.com/es-ES/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/concatenate.htm)
* [Map](https://help.qlik.com/es-ES/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Map.htm)
* [Only](https://help.qlik.com/es-ES/sense/November2025/Subsystems/Hub/Content/Sense_Hub/Scripting/Only.htm)