SQL · modificación de datos

UPDATE con JOIN: actualizar una tabla usando otra

Usa datos de una tabla auxiliar para modificar filas de otra sin perder de vista el alcance, la unicidad de las coincidencias ni las diferencias de sintaxis entre motores.

Lectura: 7–9 minSQL y variantes contrastadosPráctica con pistas
Contenido de esta guía

Respuesta rápida

Un UPDATE con JOIN usa otra tabla para decidir qué filas cambiar y, a menudo, de dónde sale el nuevo valor. No existe una única sintaxis portable: PostgreSQL y SQLite usan UPDATE ... FROM, MySQL coloca el JOIN después de UPDATE y SQL Server usa FROM incluyendo la tabla objetivo.

PostgreSQL y SQLite
UPDATE productos AS p
SET precio = n.precio
FROM precios_nuevos AS n
WHERE p.id = n.producto_id;

La relación debe identificar con claridad qué fila de precios_nuevos corresponde a cada producto.

Primero convierte el UPDATE en un SELECT

Antes de modificar datos, ejecuta la misma relación como consulta de lectura. Así compruebas alcance, duplicados y valores nuevos sin cambiar ninguna fila.

Preflight seguro
SELECT p.id, p.nombre, p.precio AS precio_actual,
       n.precio AS precio_nuevo
FROM productos AS p
JOIN precios_nuevos AS n
  ON n.producto_id = p.id
ORDER BY p.id;

Si este SELECT devuelve dos filas para el mismo p.id, detente. PostgreSQL advierte que un UPDATE ... FROM debe producir como máximo una fila de unión por fila objetivo; SQLite también documenta que, si hay varias coincidencias, una de ellas puede elegirse de forma arbitraria.

Sintaxis por motor

PostgreSQL

PostgreSQL
UPDATE productos AS p
SET precio = n.precio
FROM precios_nuevos AS n
WHERE p.id = n.producto_id;

La tabla objetivo no se repite en FROM salvo que estés haciendo un self join.

SQLite 3.33+

SQLite incorporó UPDATE FROM en la versión 3.33.0 y busca compatibilidad con la forma de PostgreSQL.

SQLite
UPDATE productos AS p
SET precio = n.precio
FROM precios_nuevos AS n
WHERE p.id = n.producto_id;

MySQL

MySQL
UPDATE productos AS p
JOIN precios_nuevos AS n
  ON n.producto_id = p.id
SET p.precio = n.precio;

MySQL permite una sintaxis de actualización multitabla. En esa variante no se usa FROM después de SET.

SQL Server

SQL Server
UPDATE p
SET p.precio = n.precio
FROM productos AS p
JOIN precios_nuevos AS n
  ON n.producto_id = p.id;

En Transact-SQL la tabla objetivo aparece también dentro del FROM.

Tres controles antes de modificar

  1. Una coincidencia por destino: protege precios_nuevos.producto_id con una clave o restricción UNIQUE si el modelo exige una sola fila por producto.
  2. Preflight: compara filas actuales y valores nuevos con SELECT.
  3. Transacción: si el motor y el entorno lo permiten, ejecuta el cambio dentro de una transacción y vuelve a consultar antes de COMMIT.

Un JOIN que multiplica la fila objetivo

No trates una unión uno-a-muchos como si fuera uno-a-uno. Si necesitas derivar un único valor desde muchas filas, agrupa primero o define una regla inequívoca.

Práctica: aplica un precio de staging

Intermedia · modificación segura

Actualiza solo los productos con precio nuevo

En una copia de práctica, precios_nuevos contiene (2, 52.00) y (5, 64.50). Actualiza productos.precio usando la clave producto_id.

Qué debes recordar

  • UPDATE con JOIN es un patrón, no una sintaxis universal.
  • Comprueba primero el JOIN con SELECT.
  • Una fila objetivo debería recibir una única fila fuente salvo que agregues explícitamente.
  • PostgreSQL/SQLite, MySQL y SQL Server escriben este patrón de forma diferente.

Conceptos relacionados

Fuentes técnicas consultadas

Las variantes se contrastaron con documentación oficial; no asumas que una forma funciona igual en otro motor.