none
Error en update de mysql RRS feed

  • Pregunta

  • Hola a todos:

    Tengo un problema al tratar de ejecutar un update en mysql, he de comentar que la misma en sqlserver funciona perfectamente, es nada mas en mysql que me da error.

    El error es: YOU COUN'T SPECIFY TABLE BALANCES FOR UPDATE IN FROM CLAUSE

    ElseIf Configuracion.strNombreBaseDeDatos = "MySqlPerseo" Then
                                    cmd.CommandText = "UPDATE BALANCES SET " & ejer & " = 0" &
                                                        " WHERE IdEmpresa = @empresa AND PlanConta = 'ENTPUB_10'" &
                                                        " AND Cód_GC IN " &
                                                        "(SELECT Left(Cód_GC,3) FROM BALANCES " &
                                                        " WHERE IdEmpresa = @empresa AND PlanConta = 'ENTPUB_10'" &
                                                        " AND LENGTH(Cód_GC)=4 GROUP BY Left(Cód_GC,3) " &
                                                        " HAVING SUM(" & ejer & ") <> 0)"
    
                                End If
    
                                'cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@ejercicios", ejer)
                                cmd.Parameters.Clear()
                                cmd.Parameters.Add(Configuracion.CreateParameter(cmd, "@empresa", VarGlobal.StrCodEmpresa))
    
                                ' Asignamos la conexión al comando
                                cmd.Connection = cnn
    
                                ' Ejecutamos la primera consulta
                                ' Dim x As Int32 = cmd.ExecuteNonQuery()
                                cmd.ExecuteNonQuery()
                                'MessageBox.Show(CStr(x))

    Alguna cosa especial de mysql no la estoy tratando bien, pero por mas que he buscado en funciones mysql no doy con la misma. He de comentar que no tengo experiencia en mysql pero un usuario necesita que se le entre el programa con dicha base de datos. Todo lo demás de selects, updates, etc, ya lo tengo arreglado, solo me falta solucionar ese error.

    Un cordial saludo a todos.

    Gemma

    domingo, 9 de julio de 2017 8:20

Respuestas

  • Hola @gemma

    Revisa este articulo MySQL Error 1093 - Can't specify target table for update in FROM clause

    Saludos


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    • Marcado como respuesta gemma_campillo domingo, 9 de julio de 2017 16:02
    domingo, 9 de julio de 2017 14:18
  • Te sugiero reconfigurar la sentencia para que la subconsulta se precalcule antes del Update. Fíjate que no es una subconsulta correlacionada (el Select se puede ejecutar por sí solo ya que no tiene referencias a ningún campo del update). Por tanto, ejecuta el select, guarda los resultados en una variable, y luego haz el Update ... where ... Cód_GC in (" & lavariable & ")".

    Eso te permite quitar la tabla balances del where, saltándote el error que te de sqlite.

    • Marcado como respuesta gemma_campillo domingo, 9 de julio de 2017 16:02
    domingo, 9 de julio de 2017 14:01
  • "Wrappea" la subconsulta para evitar que la tabla que se actualiza corresponda a la subconsulta de primer orden.

    cmd.CommandText = $"UPDATE BALANCES SET " & ejer & " = 0 " &
                "WHERE IdEmpresa = @empresa  AND PlanConta = 'ENTPUB_10' AND Cód_GC IN" &
                "(SELECT R FROM " &
                    "(SELECT LEFT(Cód_GC,3) AS R FROM BALANCES " &
                        "WHERE IdEmpresa = @empresa AND PlanConta = 'ENTPUB_10' " &
                        "AND LENGTH(Cód_GC) = 4 " &
                        "GROUP BY LEFT(Cód_GC, 3) HAVING SUM(" & ejer & ") <> 0) T);"


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta gemma_campillo domingo, 9 de julio de 2017 16:02
    domingo, 9 de julio de 2017 15:46
  • El mensaje que obtienes se refiere a la infracción que cometes respecto a la sintaxis de UPDATE: No es posible actualizar una tabla y efectuar una consulta de selección sobre la misma tabla en una subconsulta de primer orden.

    13.2.11 UPDATE Syntax

    Una forma de resolver el caso es envolviendo la subconsulta en una consulta externa, de eso se trata el código propuesto, sin embargo, ¿sigues obteniendo el mismo error?

    Prueba la consulta en la herramienta cliente que ocupes:

    SET @empresa = 1; -- Escribir valor existente
    UPDATE BALANCES SET <NombreCol> = 0
    WHERE 
        IdEmpresa = @empresa AND PlanConta = 'ENTPUB_10' 
        AND Cód_GC IN
        (
    	SELECT R
    	FROM
            (
    		SELECT LEFT(Cód_GC,3) AS R			
    		FROM BALANCES 
    		WHERE IdEmpresa = @empresa AND PlanConta = 'ENTPUB_10' AND LENGTH(Cód_GC) = 4
    		GROUP BY LEFT(Cód_GC, 3) 
    		HAVING SUM(<NombreCol>) <> 0
    	) T
        );


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta gemma_campillo domingo, 9 de julio de 2017 17:47
    domingo, 9 de julio de 2017 17:09

Todas las respuestas

  • Te sugiero reconfigurar la sentencia para que la subconsulta se precalcule antes del Update. Fíjate que no es una subconsulta correlacionada (el Select se puede ejecutar por sí solo ya que no tiene referencias a ningún campo del update). Por tanto, ejecuta el select, guarda los resultados en una variable, y luego haz el Update ... where ... Cód_GC in (" & lavariable & ")".

    Eso te permite quitar la tabla balances del where, saltándote el error que te de sqlite.

    • Marcado como respuesta gemma_campillo domingo, 9 de julio de 2017 16:02
    domingo, 9 de julio de 2017 14:01
  • Hola @gemma

    Revisa este articulo MySQL Error 1093 - Can't specify target table for update in FROM clause

    Saludos


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    • Marcado como respuesta gemma_campillo domingo, 9 de julio de 2017 16:02
    domingo, 9 de julio de 2017 14:18
  • "Wrappea" la subconsulta para evitar que la tabla que se actualiza corresponda a la subconsulta de primer orden.

    cmd.CommandText = $"UPDATE BALANCES SET " & ejer & " = 0 " &
                "WHERE IdEmpresa = @empresa  AND PlanConta = 'ENTPUB_10' AND Cód_GC IN" &
                "(SELECT R FROM " &
                    "(SELECT LEFT(Cód_GC,3) AS R FROM BALANCES " &
                        "WHERE IdEmpresa = @empresa AND PlanConta = 'ENTPUB_10' " &
                        "AND LENGTH(Cód_GC) = 4 " &
                        "GROUP BY LEFT(Cód_GC, 3) HAVING SUM(" & ejer & ") <> 0) T);"


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta gemma_campillo domingo, 9 de julio de 2017 16:02
    domingo, 9 de julio de 2017 15:46
  • Hola a los tres:

    Muchas gracias como siempre por vuestra valiosa ayuda.

    Querido Williams, al final corro con tu respuesta porque es la que más se acerca a lo que ya tengo hecho con otras bases de datos, pero esta "MYsql" es un poco rebelde.

    Me da el error siguiente:

    "You can't especify target table 'BALANCES' for update in FROM clause" y no me entero de que quieres decir.

    Bueno, de todas formas voy a ir probando con todo lo que me habéis preparado.

    Muchas gracias como siempre y un fuerte abrazo.

    Gemma

    domingo, 9 de julio de 2017 16:02
  • El mensaje que obtienes se refiere a la infracción que cometes respecto a la sintaxis de UPDATE: No es posible actualizar una tabla y efectuar una consulta de selección sobre la misma tabla en una subconsulta de primer orden.

    13.2.11 UPDATE Syntax

    Una forma de resolver el caso es envolviendo la subconsulta en una consulta externa, de eso se trata el código propuesto, sin embargo, ¿sigues obteniendo el mismo error?

    Prueba la consulta en la herramienta cliente que ocupes:

    SET @empresa = 1; -- Escribir valor existente
    UPDATE BALANCES SET <NombreCol> = 0
    WHERE 
        IdEmpresa = @empresa AND PlanConta = 'ENTPUB_10' 
        AND Cód_GC IN
        (
    	SELECT R
    	FROM
            (
    		SELECT LEFT(Cód_GC,3) AS R			
    		FROM BALANCES 
    		WHERE IdEmpresa = @empresa AND PlanConta = 'ENTPUB_10' AND LENGTH(Cód_GC) = 4
    		GROUP BY LEFT(Cód_GC, 3) 
    		HAVING SUM(<NombreCol>) <> 0
    	) T
        );


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta gemma_campillo domingo, 9 de julio de 2017 17:47
    domingo, 9 de julio de 2017 17:09
  • Hola Williams:

    Impresionante, funciona correctamente.

    No se como eres capaz de saber como montar esa sql de diferentes formas.

    En fin, seguiré aprendiendo.

    Muchas gracias querido amigo.

    Un fuerte abrazo.

    Gemma

    domingo, 9 de julio de 2017 17:47