Это способ обновить с использованием простого UPDATE
из обновляемого представления объединения .
Сначала вы объединяете две таблицы, выбирая столбцы, которые должныбыть обновлены и исходные столбцы для обновления:
select a.id, a.service_date, b.paid_date
from student a
join student_claim b
on a.id = b.student_id
where b.paid_date is NULL and
a.service_date is not NULL
Обратите внимание, что при выполнении этого выбора вы можете проверить, scoupe, если будущее UPDATE
.
I 'Например, исключая строки с service_date is NULL
, так как вы, вероятно, не захотите обновить NULL до NULL (в случае, если столбец равен nullable )
Чем обернуть запрос на соединение как подзапрос и выполнитьUPDATE
на нем.
update (
select a.id, a.service_date, b.paid_date
from student a
join student_claim b
on a.id = b.student_id
where b.paid_date is NULL and
a.service_date is not NULL
)
set paid_date = service_date
Обратите внимание, что единственным предварительным условием для этого является то, что таблица STUDENT
является сохраняющей ключ . т. е. для присоединенного ключа существует уникальный индекс (что наиболее вероятно, если ID
является первичным ключом).
В противном случае вы получите это исключение ORA-01779: cannot modify a column which maps to a non key-preserved table
.
В противоположность этому вы можете использовать оператор MERGE
в случае, если в таблице STUDENT больше строк с таким же ID
, но оператор будет иметь значение ORA-30926: unable to get a stable set of rows in the source tables