none
ACTUALIZAR CAMPOS DE TABLAS MEDIANTE INNER JOIN RRS feed

  • Pregunta

  • HOLA A TODOS!!

    MI PROBLEMA ES EL SIGUIENTE :

    TENGO UN STORE PROCEDURE QUE ACTUALIZA UNA TABLA , PERO ESTA TABLA ESTA RELACIONADA CON OTRA TABLA.

    LOS DEMAS CAMPOS DE LA TABLA 1 SE ACTUALIZAN SIN PROBLEMAS , PERO EL CAMPO PK DE LA TABLA 1 Y EL FK DE LA TABLA 2 

    SE QUEDAN IGUALES Y NO SE ACTUALIZAN. EL OBJETIVO ES QUE PUEDA ACTUALIZARLOS AMBOS .... AQUI ESTA MI QUERY:

     

     

    DECLARE @SERIE INT

    DECLARE @MODELO NVARCHAR(35)

    DECLARE @DESCRIPCION NVARCHAR(50)

     

    SET @SERIE=1

    SET @MODELO='ABC'

    SET @DESCRIPCION='PRUEBA'

     

    UPDATE TBL_ARTICULO 

     SET 

      SERIE=@SERIE,

      MODELO=@MODELO,

      DESCRIPCION=@DESCRIPCION

     WHERE SERIE=@SERIE

     

    UPDATE TBL_INVENTARIO

      SET SERIE=( SELECT TBL_ARTICULO.SERIE FROM TBL_ARTICULO

                 WHERE TBL_INVENTARIO.SERIE=TBL_ARTICULO.SERIE ) 

    LO TENGO DE ESTA MANERA , HACIENDO DOS UPDATE , Y NO C COMO HACERLO CON UN SOLO UPDATE Y QUE ME ACTUALIZE TODO DE LA TABLA ARTICULOS Y DE LA TABLA INVENTARIO , SOLAMENTE ME INTERESA EL CAMPO SERIE.

    COMO ME DICE:

    0 ROWS AFCTED

    1 ROWS AFECTED , PERO NO CAMBIA NADA DE NINGUNA DE LAS DOS TABLAS...

    ESERO SU AYUDA PLZ.... :)

     

     


    Indet
    viernes, 23 de septiembre de 2011 8:58

Respuestas

  • Bueno, haces varias preguntas, así que iré por partes:

    • un UPDATE sólo puede afectar a una única tabla, así que si quieres actualizar dos tablas, tendrás que escribir dos instrucciones UPDATE, no hay otra (sí, se podría hacer por medio de un trigger INSTEAD OF, pero al final se sigue escribiendo dos UPDATE)
    • el primer UPDATE no actualiza el campo SERIE (que supongo que es la PK) porque no le asignas un valor diferente: por un lado filtras por el valor 1 de este campo y por otro le asignas ese mismo 1... SQL no cambia nada porque así se lo indicas tú
    • cuando quieres actualizar varios registros combinándolos con otro conjunto de resultados, la forma correcta de hacerlo sería así:
    UPDATE i SET SERIE=a.SERIE FROM TBL_ARTICULO AS a INNER JOIN TBL_INVENTARIO AS i ON a.SERIE=i.SERIE
    

    Y si necesitas actualizar la clave primaria de una tabla y existen otras tablas que a su vez están relacionadas con ésta, la forma de hacerlo es habilitando la opción ON UPDATE CASCADE de la clave foránea que hayas establecido.
    viernes, 23 de septiembre de 2011 9:07

Todas las respuestas

  • Bueno, haces varias preguntas, así que iré por partes:

    • un UPDATE sólo puede afectar a una única tabla, así que si quieres actualizar dos tablas, tendrás que escribir dos instrucciones UPDATE, no hay otra (sí, se podría hacer por medio de un trigger INSTEAD OF, pero al final se sigue escribiendo dos UPDATE)
    • el primer UPDATE no actualiza el campo SERIE (que supongo que es la PK) porque no le asignas un valor diferente: por un lado filtras por el valor 1 de este campo y por otro le asignas ese mismo 1... SQL no cambia nada porque así se lo indicas tú
    • cuando quieres actualizar varios registros combinándolos con otro conjunto de resultados, la forma correcta de hacerlo sería así:
    UPDATE i SET SERIE=a.SERIE FROM TBL_ARTICULO AS a INNER JOIN TBL_INVENTARIO AS i ON a.SERIE=i.SERIE
    

    Y si necesitas actualizar la clave primaria de una tabla y existen otras tablas que a su vez están relacionadas con ésta, la forma de hacerlo es habilitando la opción ON UPDATE CASCADE de la clave foránea que hayas establecido.
    viernes, 23 de septiembre de 2011 9:07
  • OK TE ENTENDI PERFECTAMENTE !!

    ESO ES LO QUE QUIERO ....LAS VARIABLES QUE VEZ EN EL QUERY SON DE EJEMPLO, PERO EN REALIDAD ESTAS LA MANDO DESDE LA APLICACION EN C#

    EXACTO! ESO ES LO QUE QUIERO ACTUALIZAR LA CLAVE PRIMARIO DE LA TABLA ARTICULOS CON LOS CAMPOS ESPECIFICADOS Y A LA VEZ QUE SE CAMBIE LA FK EN LA TABLE INVENTARIO (DE INVENTARIO SOLO ME INTERESA LA FK)

    ENTONCES COMO HAGO PARA ACTUALIZAR EN CASCADA COMO DICES ?


    Indet
    viernes, 23 de septiembre de 2011 9:12