[SQL] Modificar campo comparando 2 tablas

Planteo aquí una duda que quizás tenga una fácil respuesta, pero como no soy usuario habitual de SQL no sé cómo hacer. La cuestión es la siguiente:

Tengo una base de datos (llamémosla por ejemplo 'BD1') En el cual tengo dos tablas con los siguientes campos:
- Tabla1 (IdTarjeta, Estado)
- Tabla2 (IdTarjeta, Condición)

La cuestión es que los valores de los campos IdTarjeta de ambas tablas son los mismos y quisiera modificar el valor del campo 'Estado' de la Tabla 1 cuando la línea coincidente de Tabla 2 tenga un valor específico en 'Condición')

Ejemplo:

Tabla 1
38650 - 0
56830 - 0
34854 - 0
95642 - 0
76459 - 0

Tabla 2
38650 - A
56830 - B
34854 - C
95642 - B
76459 - D

Quisiera cambiar el 'Estado' de la tabla 1 de 0 a 1 cuando 'Condición' de la Tabla 2 sea B, quedando la Tabla 1 de la siguiente forma:

Tabla 1
38650 - 0
56830 - 1
34854 - 0
95642 - 1
76459 - 0

Espero haberme explicado bien...

Un saludo y muchas gracias.
Hola

Entiendo que lo que quieres hacer es que, al actualizar un registro de la tabla2, el registro coincidente de la tabla1, actualice su valor en funcion de lo que hayas puesto en la tabla2.

¿Es correcto?

Yo utilizaria un TRIGGER AFTER UPDATE
Bueno días ,

1 -Tienes que hacer un update haciendo inner join a la otra tabla con el campo idTarjeta

2 - En el where poner la condición que quieras que se cumpla


Por lo que entendi esto creo que te debería servir.

PD: Si lo que quieres hacer es que cuando se actualize la tabla 2 . También se actualize la tabla 1 entonces puedes hacer un trigger

Un saludo
morenen escribió:Hola

Entiendo que lo que quieres hacer es que, al actualizar un registro de la tabla2, el registro coincidente de la tabla1, actualice su valor en funcion de lo que hayas puesto en la tabla2.

¿Es correcto?

Yo utilizaria un TRIGGER AFTER UPDATE


No exactamente. Las bases de datos ya tienen la información, sería modificar unos campos en concreto de unas líneas ya existentes.
jesus9 escribió:Bueno días ,

1 -Tienes que hacer un update haciendo inner join a la otra tabla con el campo idTarjeta

2 - En el where poner la condición que quieras que se cumpla


Por lo que entendi esto creo que te debería servir.

PD: Si lo que quieres hacer es que cuando se actualize la tabla 2 . También se actualize la tabla 1 entonces puedes hacer un trigger

Un saludo


Creo que es lo que dices. ¿Podrías ponerme un ejemplo? Estoy muy pez en SQL y llevo media hora probando y me da errores de sintaxis.
Deberia ser algo parecido a esto;


UPDATE Tabla1 AS T
INNER JOIN Tabla2 as TA
ON T.IdTarjeta = TA.IdTarjeta
SET T.Estado=1
WHERE TA.Condicion = 'B'

Otra forma seria poner from

UPDATE
SET T.Estado=1
FROM Tabla1 AS T
INNER JOIN Tabla2 as TA
ON T.IdTarjeta = TA.IdTarjeta
WHERE TA.Condicion = 'B'

Ya me diras si te funciona
jesus9 escribió:Deberia ser algo parecido a esto;


UPDATE Tabla1 AS T
INNER JOIN Tabla2 as TA
ON T.IdTarjeta = TA.IdTarjeta
SET T.Estado=1
WHERE TA.Condicion = 'B'

Otra forma seria poner from

UPDATE
SET T.Estado=1
FROM Tabla1 AS T
INNER JOIN Tabla2 as TA
ON T.IdTarjeta = TA.IdTarjeta
WHERE TA.Condicion = 'B'

Ya me diras si te funciona


Muchas gracias de nuevo. He estado haciendo pruebas desde el SQL Server Manegement Express con un backup de la base de datos para no cargarme nada, pero por más que pruebo diferentes opciones siempre me da error de sintaxis. Lo último que he probado es hacer pruebas con SELECT e INNER JOIN para ver los resultados antes de probar a actualizar datos con el UPDATE pero ni así soy capaz de que me muestre las líneas correspondientes. Seguiré probando, pero lo que en principio parecía no demasiado complejo se está volviendo un tanto puñetero.
No debería dar un error de sintaxis.
No lo comprobe en slq management ya que no lo tengo instalado en este ordenador pero tampoco es algo tan complicado lo que estas intentando hacer


Puedes pegar el trozo de codigo que estas ejecutando ?
@Giacomo Agostin
¿Puede ser que ese SGBD no acepte joins en las cláusulas update? Por lo que me dijeron no es algo estándar, quizá habría que hacerlo con una subconsulta. Adaptando lo de jesus9 y si no me equivoco...

UPDATE Tabla1
SET Estado=1
WHERE IdTarjeta IN
(
  SELECT IdTarjeta
  FROM Tabla2
  WHERE Condicion = 'B'
);


Estaría bien ver el código o mensaje de error de todas maneras.
Bueno, tras pelear mucho al final he dado con la clave. Básicamente era como el segundo ejemplo que ha puesto jesus9 pero con algunos cambios. Pongo aquí la sintaxis exacta:

UPDATE BD1.Tabla1
SET Estado = 1
FROM BD1.Tabla1 AS T
INNER JOIN BD1.Tabla2 AS TA
ON T.IdTarjeta = TA.IdTarjeta
WHERE TA.Condicion = 'B'

Aunque los nombres de la base de datos, tablas y campos no son los reales, esa es la sintaxis exacta que me ha funcionado.

Muchísimas gracias a @morenen , @jesus9 y @Khin
[beer] [beer]
Qué bien que lo hayas podido sacar al final, supongo que has tenido que escribir el nombre de la BD antes de la tabla porque no la tenías seleccionada, cosa que al menos yo había dado por supuesto xD
9 respuestas