oracle如何更新多行

srk*_*786 6 sql oracle

我想为所有不同的记录更新具有不同值的多行,但不知道该怎么做,我正在使用下面的 sql 更新单个记录,但我有 200 多条记录要更新

update employee
set staff_no = 'ab123'
where depno = 1
Run Code Online (Sandbox Code Playgroud)

我有 50 个 dep,在这些 dep 中,我需要更新 200 多个员工编号。任何的想法。目前如果我只是做一个

 select * from Departments 
Run Code Online (Sandbox Code Playgroud)

我可以看到需要员工无需更新的所有员工的列表。

UPDATE person
   SET staff_no = 
       CASE person_no
            WHEN 112 THEN 'ab123'
            WHEN 223 THEN 'ab324'
            WHEN 2343 THEN 'asb324'
            and so on.....


       END
Run Code Online (Sandbox Code Playgroud)

das*_*ght 8

您应该能够使用MERGEstatement 一次性完成。但是,该语句将相当大:

MERGE INTO employee e
USING (
   SELECT 1 as d_id, 'cd234' as staff_no FROM Dual
       UNION ALL
   SELECT 2 as d_id, 'ef345' as staff_no FROM Dual
       UNION ALL
   SELECT 3 as d_id, 'fg456' as staff_no FROM Dual
       UNION ALL
   ... -- More selects go here
   SELECT 200 as d_id, 'za978' as staff_no FROM Dual
) s
ON (e.depno = S.d_id)
WHEN MATCHED THEN UPDATE SET e.staff_no= s.staff_no
Run Code Online (Sandbox Code Playgroud)


col*_*sar 4

使用 case 表达式

UPDATE employee
   SET staff_no = 
           CASE depno
                WHEN 1 THEN 'ab123'
                WHEN 2 THEN 'ab321'
                --...
                ELSE staff_no
           END
 WHERE depno IN ( 1, 2 ) -- list all cases here. use a subquery if you don't want to / cannot enumerate 
Run Code Online (Sandbox Code Playgroud)