Oracle ОБНОВЛЕНИЕ Вопрос - PullRequest
       5

Oracle ОБНОВЛЕНИЕ Вопрос

2 голосов
/ 22 января 2010

Можно ли выполнить описанное ниже обновление в одном операторе UPDATE?

Я хочу обновить значения Operators.name_id значениями Users.name_id, присоединившись к Users.name = Operators.op_name. И Users.name, и Operators.op_name имеют unique.

Я знаю, что описанная ниже ситуация не соответствует "лучшим практикам", но это гораздо более простой пример того, что я пытаюсь сделать, а именно: обновить поле значением из другой объединенной таблицы.

Table: Users
user_id    name
----------------
34         Billy
43         Jimmy
50         Joe

Table:  Operators (before UPDATE)
op_id   op_name   user_id
-------------------------
12      Billy     35
35      Jimmy     46
33      Joe       99


Table:  Operators (after UPDATE)
op_id   op_name   name_id
-------------------------
12      Billy     34
35      Jimmy     43
33      Joe       50

Ответы [ 2 ]

4 голосов
/ 22 января 2010
UPDATE   operators o
SET      user_id = 
         (
         SELECT  u.user_id
         FROM    users u
         WHERE   o.op_name = u.name
         )
WHERE    o.op_name IN
         (
         SELECT  name
         FROM    users
         )

В Oracle 10g, более эффективный:

MERGE
INTO    operators o
USING   users u
ON      (u.name = o.op_name)
WHEN MATCHED THEN
UPDATE
SET     user_id = u.user_id
3 голосов
/ 22 января 2010
update (
       select oo.user_id, uu.user_id uu_id
         from operators oo
              join
              users uu on uu.name = oo.op_name
       )
   set user_id = uu_id

Вот полный тестовый скрипт (я использую my_users и my_operators, чтобы не связываться с вашими данными).

drop table my_users;
create table my_users (
                      user_id number(2),
                      name    varchar2(30) unique
                      )
;
insert into my_users (user_id, name)
  select 34, 'Billy' from dual union all
  select 43, 'Jimmy' from dual union all
  select 50, 'Joe'   from dual
;
drop table my_operators;
create table my_operators (
                          op_id   number(2),
                          op_name varchar2(30) unique,
                          user_id number(2)
                          )
;
insert into my_operators (op_id, op_name, user_id)
  select 12, 'Billy', 35 from dual union all
  select 35, 'Jimmy', 46 from dual union all
  select 33, 'Joe',   99 from dual
;
update (
       select oo.user_id, uu.user_id uu_id
         from my_operators oo
              join
              my_users uu on uu.name = oo.op_name
       )
   set user_id = uu_id
;
select * from my_operators;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...