Обновить значения в таблице, значениями из другой таблицы

Нужно обновить значение t1 таблицы значениями из t2. В обоих таблицах есть id и нужно только те, которые есть в обоих таблицах.

Я пробовал сделать это следующим запросом:

update t1 set (t1.n_dog) = (
    select t2.n_dog
    from t2
    join t1 on t1.idblank=t2.idblank);

на что получаю ошибку:

ORA-01427: single-row subquery returns more than one row

Поискав на этом сайте, нашёл подобную тему.

И там есть решение:

UPDATE DISHES d SET (d.price, d.calories) = ( SELECT dc.price, dc.calories 
                          FROM DISH_PRICE_CALORIES dc
                          WHERE d.id = dc.dish_id );

На мой взгляд, ситуации похожи, но только у меня один столбец.

Почему получаю эту ошибку?


Ответы (1 шт):

Автор решения: 0xdb

Попробуйте так:

update t1 set t1.n_dog = (
    select t2.n_dog
    from t2
    where t2.idblank=t1.idblank);

Если сработает, то решите, что должен получить столбец t1.n_dog, если нет совпадения этих двух таблиц. Так, как выше, он получит значение NULL, если это не устраивает, см. дальше.


Более гибкий способ обновления из другой таблицы в следующем воспроизводимом примере. 3-и записи уже имеют желаемое значение, остаются 6-ь записей:

create table t1 (id, val) as
    select rownum, rownum*10 
    from dual connect by level<=9 
/
create table t2 (id, val) as
    select id, val+mod (id,3) from t1 
/
merge into t1 
using t2 on (t2.id = t1.id)
when matched then
    update set t1.val = t2.val
    where t1.val != t2.val
/

6 rows merged.      
→ Ссылка