MERGE
Utilice el comando MERGE para insertar, actualizar o suprimir filas de una tabla de destino utilizando datos de un origen como una tabla, vista o subconsulta y basándose en reglas especificadas para una condición de coincidencia.
Dentro del comando, debe especificar como mínimo una sentencia condición_coincidencia para identificar las filas que desea actualizar, insertar o suprimir. Para obtener más información sobre las operaciones MERGE o sobre el uso de MERGE durante la carga de datos, consulte la Guía de carga de datos deIBM® Netezza®.
Sintaxis
MERGE INTO target_table [ [ AS ] target_alias [ ( column_alias_list ) ] ]
USING source_table [ [ AS ] source_alias [ ( column_alias_list ) ] ]
ON matching_condition
when_condition_then_action [, ...]
[ ELSE IGNORE ]
La sentencia when_condición_then_acción tiene las opciones siguientes.
WHEN MATCHED [ AND bool_expression ] THEN
UPDATE SET column = expression [, ...]
|
WHEN MATCHED [ AND bool_expression ] THEN
DELETE
|
WHEN NOT MATCHED [ AND bool_expression ] THEN
INSERT [ ( column_alias_list ) ] VALUES ( values_list )
|
WHEN NOT MATCHED [ AND bool_expression ] THEN
INSERT DEFAULT VALUES
Entradas
| Entrada | Descripción |
|---|---|
| TARGET_TABLE | Nombre de la tabla donde se deben insertar, actualizar o suprimir filas. La tabla de destino debe residir en la base de datos actual (la base de datos a la que está conectado). La tabla debe ser una tabla de usuario; MERGE no se soporta para tablas de catálogo de sistema, tablas externas, tablas con versión, tablas de filas protegidas o una tabla de constantes. |
| alias_objetivo | Nombre de alias para la tabla de destino para utilizarlo en el comando MERGE. |
| lista_alias_columna | Lista opcional de nombres de alias para las columnas de las tablas de destino para su uso en el comando MERGE. |
| SOURCE_TABLE | Nombre de la tabla de origen que contiene las filas utilizadas para la coincidencia de MERGE. La tabla de destino debe residir en la base de datos actual (la base de datos a la que está conectado). La tabla debe ser una tabla de usuario; MERGE no se soporta para tablas de catálogo de sistema, tablas externas, tablas con versión, tablas de filas protegidas o una tabla de constantes. |
| alias_fuente | Nombre de alias opcional para la tabla de origen. |
| lista_alias_columna | Lista opcional de nombres de alias para las columnas de la tabla de origen. |
| condición_de_coincidencia | Condición de unión utilizada para identificar las columnas de coincidencia a fin de hacer coincidir las filas de la tabla de origen con las filas de la tabla de destino. La condición de unión debe utilizar claves exclusivas de forma que haya como máximo una coincidencia de las filas de la tabla de origen con las filas de la tabla de destino. |
| cuando_condición_entonces_acción | Como mínimo una, y opcionalmente varias, condiciones de coincidencia
y acciones a realizar para las filas de las tablas de origen y de destino. Las condiciones pueden tomar cualquiera de las formas siguientes:
El comando ejecuta una clasificación de coincidencia de cada fila de la tabla de origen y destino hasta que se encuentra una coincidencia, |
| ELSE IGNORE | Esta sintaxis es compatible con DB2 y no realiza ninguna acción sobre el comando MERGE en NPS. |
Resultados
El comando MERGE tiene las siguientes salidas:
| Resultado | Descripción |
|---|---|
| MERGE ins/upd/del | El comando se ha ejecutado satisfactoriamente y ha insertado el número de ins de filas en la tabla de origen, ha actualizado el número de upd de filas en la tabla de origen y ha suprimido el número de del de filas de la tabla de origen. |
| DBOS cannot modify a system catalog | El comando MERGE no puede actualizar una tabla de catálogo de sistema. |
| ERROR: Cannot have UPDATE below WHEN NOT MATCHED | No puede especificar una operación de actualización o de supresión en una condición WHEN NOT MATCHED. De forma similar, no puede especificar una operación INSERT por debajo de una condición WHEN MATCHED. |
| ERROR: Update cancelled: attempt to update a target row with values from multiple join rows | La tabla de origen no puede tener más de una fila que coincida con una fila de la tabla de destino basándose en la condición de unión de la cláusula ON. Si se produce este error, deberá comprobar la tabla de origen y ejecutar consultas para determinar si tiene varias filas que coincidan con la condición de unión con la tabla de destino. |
Privilegios
Debe ser el usuario administrativo, el propietario de la tabla de destino, el propietario de la base de datos o el esquema donde está definida la tabla de destino o la cuenta debe tener privilegios de inserción (Insert), actualización (Update) y supresión (Delete) para la tabla de destino o la clase de objeto de tabla. También de debe tener el privilegio Select para cualquier tabla especificada en una cláusula WHERE.
Uso
Se proporciona el siguiente uso de muestra.
- Una fusión de una tabla de cuentas nueva en una tabla de clientes existente
donde la coincidencia está en los nuevos ID de clave de cliente exclusivos:
MYDB.SCH1(USER)=> MERGE INTO customers as c using new_accounts as na on c.c_custkey = na.c_custkey when not matched then insert values (n.*); MERGE 125/0/0 - Una fusión de una tabla de cuentas nueva en una tabla de clientes existente
donde la coincidencia está en los nuevos ID de clave de cliente exclusivos:
MYDB.SCH1(USER)=> MERGE INTO customers as c using new_accounts as na on c.c_custkey = na.c_custkey when not matched then insert values (n.*); MERGE 125/0/0
Resolución de anomalías de MERGE debido a varias filas de unión
Si el comando MERGE devuelveERROR: Update cancelled: attempt to update a target row with values from multiple join rowsuna fila de la tabla de destino coincide con más de una fila de la tabla de origen de la fusión. Compruebe que en la tabla de origen hay varias filas que coinciden con la condición JOIN. Como ejemplo simple, suponga que tiene una tabla denominada inventory con una lista de componentes:
TESTER.ADMIN(ADMIN)=> select * from inventory order by product_id;
PRODUCT_ID | PROD_DESC
------------+----------------------
101 | red ballpoint pens
102 | blue ballpoint pens
103 | black ballpoint pens
104 | scissors
(4 rows)En una base periódica, se fusionan las filas de una tabla denominada new_products que contiene componentes nuevos disponibles para pedido. A continuación se muestra una tabla de ejemplo new_products. Observe que la tabla tiene dos filas para componentes con el mismo ID de producto (104), que ya existe en la tabla de inventario:
TESTER.ADMIN(ADMIN)=> select * from new_products order by productid;
PRODUCTID | PRODDESC
-----------+---------------
104 | 8in scissors
104 | 6in scissors
105 | protractor
106 | pencil eraser
(4 rows)Si intenta fusionar la tabla new_products en la tabla inventory y unir en los ID de producto, el comando MERGE falla:
TESTER.ADMIN(ADMIN)=> merge into inventory as i using new_products as n
on n.productid = i.product_id
when not matched then
insert values (n.*)
when matched then update set i.prod_desc = n.proddesc;
ERROR: Update cancelled: attempt to update a target row with values from multiple join rowsSi el comando MERGE falla con este error, debe identificar las filas duplicadas de la tabla de origen que coinciden con las condiciones de unión para la misma fila de la tabla de destino. Por ejemplo:
TESTER.ADMIN(ADMIN)=> select productid from new_products n
where n.productid in (select i.product_id from inventory i)
group by n.productid having count(*) > 1;
PRODUCTID
-----------
104
(1 row)A continuación, puede realizar pasos para arreglar la tabla de origen a eliminar o direccionar cualquiera de las múltiples filas coincidentes para que no haya más una coincidencia que utilice la condición de unión para una fila en la tabla de destino.