SQL: Cómo actualizar un conjunto de filas sin cursor

De forma general, el formato de la sentencia UPDATE necesaria sería el siguiente:

update tabla_destino alias_td
set alias_td.atributo = (
select alias_to.atributo
from tabla_origen alias_to
where alias_td.clave_primaria = alias_to.clave_primaria)
where alias_td.clave_primaria in 
(select clave_primaria from tabla_origen)

Este UPDATE actualiza un atributo de un conjunto de tuplas a partir de un atributo de un segundo conjunto.

Analizando cada parte, tenemos:

1. Indicamos el atributo de la tabla que vamos a actualizar

update tabla_destino alias_td
set alias_td.atributo =

2. Seleccionamos el atributo de la tabla origen del que tomar el nuevo valor. Concretamente estamos seleccionando aquellas tuplas de la tabla origen cuya clave primaria coincide con la clave primaria de la tabla destino (la condición podría haber sido sobre otro campo, pero siempre de valor único).

(select alias_to.atributo
from tabla_origen alias_to
where alias_td.clave_primaria = alias_to.clave_primaria)

3. Seleccionamos el conjunto de tuplas a actualizar. Actualizaremos aquellas tuplas cuya clave primaria esté dentro del conjunto de claves primarias de la tabla origen. Sin esta cláusula se actualizarían todas las tuplas de la tabla destino en lugar de hacerlo únicamente en las que nos interesan. Su ausencia supondría el problema de asignar el valor null en aquellas tuplas cuya clave primaria no aparece en el conjunto de la subconsulta, ya que la condición "alias_td.clave_primaria = alias_to.clave_primaria" de la subconsulta no sería cierta en estos casos y devolvería null.

where alias_td.clave_primaria in (select clave_primaria from tabla_origen)

Como ejemplo, veamos la forma de actualizar en la tabla "usuarios" el email y teléfono a partir de la tabla "tmp_usuarios":

update seg_usuario s
set s.usuario_mail = (select f.email from tmp_usuarios f where s.seg_usuario_id = f.usuario),
s.tf = (select f.telefono from tmp_usuarios f where s.usuarios_id = f.usuario)
where s.usuarios_id in (select usuario from tmp_usuarios)

0 comentarios: