2011-02-01 20 views
10

Estoy buscando una explicación clara de lo que realmente hace la declaración MERGE en Oracle.¿Podría alguien explicar lo que realmente hace la declaración MERGE en Oracle?

Aquí es lo que busco:

MERGE INTO (target_table) t 
USING (source_view) s 
    ON (join condition) 
WHEN MATCHED THEN UPDATE SET col1 = val1 [, ...] 
WHEN NOT MATCHED THEN INSERT (col1 [, ...]) VALUES (val1 [, ...]) 
  • qué tipo de unión se realiza? Creo que es una combinación externa completa, ¿estoy en lo cierto?
  • con respecto a la parte WHEN MATCHED: ¿qué ocurre cuando una fila de t coincide con varias filas desde s?
  • con respecto a la parte WHEN NOT MATCHED, creo que significa "cuando una fila en s no tiene correspondencia en t". ¿Estoy en lo cierto?

Gracias.

Respuesta

11

qué tipo de unión se realiza? I creo que es una combinación externa completa, ¿verdad? ¿verdad?

No, es una unión externa normal. La consulta necesita saber cuándo hay filas en la tabla de destino que también están en la tabla fuente y cuándo hay registros en la tabla fuente que no están en la tabla de destino. Como la consulta no necesita responder a las filas que están en la tabla de destino, pero no están en la tabla fuente, no necesita que la combinación externa vaya en ambas direcciones.

Sin embargo, la unión externa no se realizará si no hay una cláusula not matched (que es perfectamente válida). El optimizador es lo suficientemente inteligente como para saber que en ese caso, una unión interna es suficiente.

con respecto a la parte cuando se combina: lo que sucede cuando una fila de t coincide con varias filas de s?

Cuando hay varias coincidencias, la actualización se realiza para cada coincidencia. Esto significa que cualquiera que sea la última actualización será la escrita en la confirmación. No hay forma de dictar un pedido, por lo que en este caso la fuente de la actualización es efectivamente aleatoria (del conjunto de coincidencias).

Como señaló @ Vincent Malgrat, esto era incorrecto. Parece que Oracle producirá un error "ORA-40926: no se puede obtener un conjunto estable de filas en la tabla de origen" si hay varias coincidencias.

con respecto a la parte Si la alineación no me creen que significa “cuando una fila de s tiene ninguna correspondencia en t”. ¿Estoy en lo cierto?

Eso es correcto.

+0

Gracias, esto es exactamente lo que quería saber. Supongo que * una combinación externa normal significa 't unirse a la derecha s' y no' t left join s'? – Benoit

+1

En cuanto a las coincidencias múltiples, el documento menciona específicamente que [MERGE es una afirmación determinista. Es decir, no puede actualizar la misma fila de la tabla de destino varias veces en la misma instrucción MERGE] (http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_9016.htm#i2081218) . Cuando la actualización es ambigua, Oracle levantará un ORA-30926 por precaución –

+0

@Benoit: Eso es correcto. Si estuviera escribiendo una consulta similar usted mismo, usaría 'right join' o' left join', desde el punto de vista del optimizador, o bien es un 'hash join outer' (típicamente). – Allan

Cuestiones relacionadas