none
¿Como puedo actualizar o eliminar un solo registro utilizando merge? RRS feed

  • Pregunta

  • Buenos días a todos, espero puedan apoyarme con una duda que tengo, la consulta es la siguiente. Bueno, tengo la siguiente consulta y para realizarla tengo que hacer un merge. Pero me pidieron que hiciera una prueba para que no modificara datos que no debo ya que es una tabla enorme y quiero modificar otra más pequeña. Lo que quiero hacer es actualizar un solo registro, pero con la estructura que tengo me modifica toda la tabla. Aunque al momento de hacer el update solo modifico la tabla que quiero afectar. Sin más rollos aquí está la consulta, quisiera saber como se modifica una sola fila, porque cuando pongo los datos iguales me sale el siguiente error:

    MERGE [f3rc4o].[dbo].[tabladestino] AS TARGETUSING

    [f3rc4o].[dbo].[tablaorigen] AS SOURCE  

    ON (TARGET.CURP = '123'    

    AND TARGET.numero_nomina = '1'     

    AND TARGET.tipo_nomina = 'O'    

    AND TARGET.periodo = '201613'  

    AND TARGET.clave_plaza = '123444')WHEN MATCHED THEN     

    UPDATE SET TARGET.num_comprobante_pago = SOURCE.num_comprobante_pago

    OUTPUT $action,

    INSERTED.num_comprobante_pago AS SourcePuntos;

    SELECT @@ROWCOUNT;

    GO

    La instrucción MERGE intentó UPDATE o DELETE en la misma fila más de una vez. Esto sucede cuando una fila de destino coincide con más de una fila de origen. Una instrucción MERGE no puede UPDATE/DELETE la misma fila de la tabla de destino varias veces. Refine la cláusula ON para asegurarse de que la fila de destino coincide sólo con una fila de origen, o utilice la cláusula GROUP BY para agrupar las filas de origen.

    Como observación, van los datos de como se me produce el error, es decir que si lo hago la comparación con SOURCE hace todo, pero en bloque. Espero se entienda mi enredada pregunta. Saludos chicos


    Fernando Cabañas


    • Editado F3RC4O martes, 6 de marzo de 2018 15:52 Codigo mal ordenado
    martes, 6 de marzo de 2018 15:51

Respuestas

  • Y le comprendo.  Pero no puedo hacer nada para ayudarle.  Sus datos hacen que el MERGE haga un INNER JOIN que resulta en la repetición de la fila de la tabla TARGET.  La única solución es asegurarse que de esto no suceda.  ¿Cómo?  Examine los datos.  Si después de examinar los datos no consigue su objetivo, entonces deberá dejar MERGE de lado y hacer un UPDATE.  En el UPDATE puede incluir una subconsulta que use DISTINCT para devolver la clave primaria del registro buscado una única vez.

    Jose R. MCP
    Code Samples

    • Marcado como respuesta F3RC4O martes, 6 de marzo de 2018 16:33
    martes, 6 de marzo de 2018 16:32

Todas las respuestas

  • Si el JOIN coincide con más de un registro en Source, ¿cómo propone usted que nosotros le digamos cómo eliminar los duplicados?  No sabemos qué desea hacer.  Lo más que le puedo decir es que examine cuidadosamente los datos y determine qué otra condición puede usar para filtrar más los datos.

    El SELECT que le puede ayudar es simple y se deriva de ese MERGE:  Como el problema es ON MATCHED, entonces es un INNER JOIN entre las tablas fuente y destino.


    Jose R. MCP
    Code Samples

    martes, 6 de marzo de 2018 16:13
  • Hola! No quiero eliminar los duplicados, solo quiero modificar un registro pero a la hora de darle todos los datos me tira el error que ya comenté anteriormente, no sé si me explique. Solo quiero eliminar uno, pero dándole todos los datos de manera estítica.

    Este es el error:

    "La instrucción MERGE intentó UPDATE o DELETE en la misma fila más de una vez. Esto sucede cuando una fila de destino coincide con más de una fila de origen. Una instrucción MERGE no puede UPDATE/DELETE la misma fila de la tabla de destino varias veces. Refine la cláusula ON para asegurarse de que la fila de destino coincide sólo con una fila de origen, o utilice la cláusula GROUP BY para agrupar las filas de origen."


    Fernando Cabañas

    martes, 6 de marzo de 2018 16:28
  • Y le comprendo.  Pero no puedo hacer nada para ayudarle.  Sus datos hacen que el MERGE haga un INNER JOIN que resulta en la repetición de la fila de la tabla TARGET.  La única solución es asegurarse que de esto no suceda.  ¿Cómo?  Examine los datos.  Si después de examinar los datos no consigue su objetivo, entonces deberá dejar MERGE de lado y hacer un UPDATE.  En el UPDATE puede incluir una subconsulta que use DISTINCT para devolver la clave primaria del registro buscado una única vez.

    Jose R. MCP
    Code Samples

    • Marcado como respuesta F3RC4O martes, 6 de marzo de 2018 16:33
    martes, 6 de marzo de 2018 16:32
  • Gracias!

    Fernando Cabañas

    martes, 6 de marzo de 2018 16:33