2010-01-22 5 views
2

Может ли обновление, описанное ниже, быть завершено в одном выражении UPDATE?Oracle 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 

ответ

4
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
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; 
+0

Стол должен быть ключом, чтобы это работало, но '@ op' указал, что они есть. ** + 1 **. – Quassnoi