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.
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.
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
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.
UPDATE productos AS p
SET precio = n.precio
FROM precios_nuevos AS n
WHERE p.id = n.producto_id;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
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
- Una coincidencia por destino: protege
precios_nuevos.producto_idcon una clave o restricciónUNIQUEsi el modelo exige una sola fila por producto. - Preflight: compara filas actuales y valores nuevos con SELECT.
- 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
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.
productos.n.precio.p.id con n.producto_id.Solución razonada
UPDATE productos AS p
SET precio = n.precio
FROM precios_nuevos AS n
WHERE p.id = n.producto_id;Con el fixture de práctica, el producto 2 queda en 52,00 y el 5 en 64,50; las demás filas conservan su precio. La comprobación local se realizó con SQLite 3.46.1.
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.