Как обновить с внутренним объединением в Oracle - PullRequest
8 голосов
/ 23 февраля 2012

Может ли кто-нибудь проверить, действительно ли внутреннее объединение с проверкой UPDATE в PL SQL? например,

Update table t
set t.value='value'
from tableb b inner join
on t.id=b.id
inner join tablec c on
c.id=b.id
inner join tabled d on
d.id=c.id
where d.key=1

Ответы [ 2 ]

15 голосов
/ 23 февраля 2012

Этот синтаксис не будет работать в Oracle SQL.

В Oracle вы можете обновить объединение, если таблицы «сохранены для ключа» , то есть:

UPDATE (SELECT a.val_a, b.val_b
          FROM table a
          JOIN table b ON a.b_pk = b.b_pk)
   SET val_a = val_b

Предполагая, что b_pk является первичным ключом b, здесь соединение может быть обновлено, потому что для каждой строки A есть самое большее одна строка из B, поэтому обновление является детерминированным.

В вашем случае, поскольку обновленное значение не зависит от другой таблицы, вы можете использовать простое обновление с условием EXIST, что-то вроде этого:

UPDATE mytable t
   SET t.VALUE = 'value'
 WHERE EXISTS 
       (SELECT NULL
          FROM tableb b
         INNER JOIN tablec c ON c.id = b.id
         INNER JOIN tabled d ON d.id = c.id
         WHERE t.id = b.id
           AND d.key = 1)
1 голос
/ 08 октября 2014
update t T  
set T.value = 'value'
where T.id in (select id from t T2, b B, c C, d D
               where T2.id=B.id and B.id=C.id and C.id=D.id and D.key=1)

-- t is the table name, T is the variable used to reffer to this table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...