2010-01-22 56 views
2

下面介紹的更新是否可以在一個UPDATE語句中完成?Oracle UPDATE問題

我想通過加入Users.name = Operators.op_name來更新Operators.name_id值與Users.name_id值。 Users.nameOperators.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_usersmy_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 2010-01-22 18:11:21