Очень часто необходимо обновить поля данными из других таблиц. Для этого создадим еще одну таблицу с данными tblname1 таким же образом как tblname. Новая таблица будет служить источником данных. В качестве соответствия между записями двух таблиц выберем условие, при котором первичный ключ первой таблицы больше первичного ключа новой таблицы на 1. Также для удобства в запросах используем локальные синонимы (алиасы) для имен таблиц.
-- для Oracle-- пользуемся тем, что в этой СУБД можно -- обновить группу столбцов одним запросом.-- предикат exist предотвращает изменение -- первой записи значениями null UPDATE tblname a SET (num, num2)= ( select num,num2 from tblname1 b where a.id=b.id+1 )WHERE exists ( select 1 from tblname1 b where a.id=b.id+1 ); -- для PostgreSQLUPDATE tblname as a SET num=b.num, num2=b.num2FROM tblname1 as bWHERE a.id=b.id+1; -- для MySQLUPDATE tblname a, tblname1 b SETa.num=b.num,a.num2=b.num2WHERE a.id=b.id+1;
Oracle позволяет обновить одну таблицу, входящую в выборку, если она жестко связана с другими таблицами выборки первичными или уникальными ключами. Если в следующем примере попробовать указать условие a.id=b.id+1 для решения предыдущей задачи, то получим ошибку.
UPDATE ( select a.*, b.num srcnum, b.num2 srcnum2 from tblname a, tblname1 b where a.id=b.id ) aSET a.num=a.srcnum, a.num2=a.srcnum2;