Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Обновление нескольких записей данными из другой таблицы.  [new]
Chukis
Member

Откуда:
Сообщений: 221
Подскажите, каким образом обновит через UPDATE сразу несколько реквизитов в нескольких строках значениями из подзапроса к другой таблице? Таблицы между собой связываются по id.
Например,
Table 1
idtovar country price
1 tomato russia
1 tomato romania
2 cucumber russia


Table2
iddatas price
1 10.10.2018 50.1
1 11.10.2018 49.9
2 10.10.2018 10


Надо цену перенести в первую таблицу исходя из цены и id.
22 янв 19, 12:35    [21790952]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких записей данными из другой таблицы.  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
Chukis,

и как во второй таблице вы понимаете: какая цена от томато Россия, а какая - от томато Романия ?
22 янв 19, 12:42    [21790958]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких записей данными из другой таблицы.  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
Chukis,

но, отвечая на ваш вопрос:
1) UPDATABLE View на базе JOIN-а таблиц
2) DML-оператор MERGE
22 янв 19, 12:43    [21790959]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких записей данными из другой таблицы.  [new]
Chukis
Member

Откуда:
Сообщений: 221
Щукина Анна,

по id совпадают товары.


Я пробовал через merge using, но не работает
22 янв 19, 12:59    [21790989]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких записей данными из другой таблицы.  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
Chukis
по id совпадают товары.
у вас у обоих томатов в первой таблице ID равен единицы. Получается, если по ID джойнить, то к каждому из томатов первой таблице вы подтяните обе цены из второй...
22 янв 19, 13:07    [21791007]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких записей данными из другой таблицы.  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
Chukis
Я пробовал через merge using, но не работает
свои вариант, конечно же, никому не показывайте. а главное - ни при каких условиях не сообщайте подробности того, что вы вкладываете в понятие "не работает"
22 янв 19, 13:08    [21791009]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких записей данными из другой таблицы.  [new]
Anton_Demin
Member

Откуда: Ставрополь
Сообщений: 294
Chukis,

по какому правилу должно обновиться поле price из первой таблицы?
22 янв 19, 14:03    [21791121]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких записей данными из другой таблицы.  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2781
Anton_Demin
Chukis,

по какому правилу должно обновиться поле price из первой таблицы?


tomato из russia дороже

....
stax
22 янв 19, 15:38    [21791279]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких записей данными из другой таблицы.  [new]
Chukis
Member

Откуда:
Сообщений: 221
Anton_Demin,
Извиняюсь за неполную таблицу. Вот такие должны быть

Table 1
idtovardatas_partiacountryprice
1tomato10.10.2018russia
1tomato11.10.2018romania
2cucumber10.10.2018russia


Table2
iddatasprice
110.10.201850.1
111.10.201849.9
210.10.201810


Таблицы связваются по ID и по Датам - datas и datas_partia
23 янв 19, 12:57    [21792004]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких записей данными из другой таблицы.  [new]
Anton_Demin
Member

Откуда: Ставрополь
Сообщений: 294
Chukis,

Вот,

UPDATE t1
SET t1.price = (SELECT t2.price FROM t2 WHERE t1.id = t2.id AND t1.datas_partia = t2.datas)
23 янв 19, 13:24    [21792046]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких записей данными из другой таблицы.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18343
Anton_Demin
Вот
UPDATE t1
SET t1.price = (SELECT t2.price FROM t2 WHERE t1.id = t2.id AND t1.datas_partia = t2.datas)

Это опасный код.
create table dropme_t(id, val)
as select rownum, 'исходное значение '||rownum
     from dual connect by level < 4;
Table created

create table dropme_t2 (id, val)
as select rownum*2, 'новое значение '||(rownum*2)
     from dual connect by level < 2;
Table created

select * from dropme_t;
        ID VAL
---------- ----------------------------------------------------------
         1 исходное значение 1
         2 исходное значение 2
         3 исходное значение 3

update dropme_t t
   set val = (select val from dropme_t2 t2 where t.id=t2.id);
3 rows updated

select * from dropme_t;
        ID VAL
---------- ----------------------------------------------------------
         1 
         2 новое значение 2
         3 

rollback;
Rollback complete

-- как правильно:

update dropme_t t
   set val = (select val from dropme_t2 t2 where t.id=t2.id)
 where exists(select null from dropme_t2 t2 where t.id=t2.id)
   ;
1 row updated

select * from dropme_t;
        ID VAL
---------- ----------------------------------------------------------
         1 исходное значение 1
         2 новое значение 2
         3 исходное значение 3


rollback;
Rollback complete

-- Как лучше:

merge into dropme_t t
      using (select * from dropme_t2) t2
      on (t.id = t2.id)
when matched
  then update set t.val = t2.val
;

1 row merged

select * from dropme_t;
        ID VAL
---------- ----------------------------------------------------------
         1 исходное значение 1
         2 новое значение 2
         3 исходное значение 3

rollback;
Rollback complete

-- Что еще можно сделать:

alter table dropme_t2
  add constraint dropme_t2$pk
      primary key(id);
Table altered

update(
  select t.val, t2.val newval
    from dropme_t t, dropme_t2 t2
   where t.id=t2.id
) set val = newval;
1 row updated

select * from dropme_t;
        ID VAL
---------- ----------------------------------------------------------
         1 исходное значение 1
         2 новое значение 2
         3 исходное значение 3

SQL> 
23 янв 19, 13:45    [21792078]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить