【问题标题】:how to update multiple rows in oracleoracle如何更新多行数据
【发布时间】:2015-04-20 22:32:45
【问题描述】:

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

update employee
set staff_no = 'ab123'
where depno = 1

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

 select * from Departments 

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

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


       END

【问题讨论】:

  • 例如 if depno =1 set staffno = ab123 ...... if depno = 2 set staffno =ab321
  • 你是说你需要更新 200 条不同值的记录吗?有没有办法计算这些值?
  • 我有大约 150 个 person_id 看起来都不同,我需要根据这些 person_id 更新 staff_no,所以简而言之 150 个 person_no 和 150 个 staff_no
  • 如果下面的答案不满足,请创建一个带有一些示例 DDL 和日期的 sqlfiddle。
  • @srk786 不要惊慌。即使没有可以让您熟悉该技术的测试数据库,在您 COMMIT 之前,您的产品数据库中也不会发生任何变化 - 首先尝试 2 个小部门,检查结果,发出 ROLLBACK

标签: sql oracle


【解决方案1】:

使用大小写表达式

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 

【讨论】:

  • 感谢您的回复,如果我将所有部门编号作为案例并在该案例中放入所有员工编号,没有子查询,我只是拉出部门表,然后我将手动输入所有员工编号
  • 您可以在单个 case 表达式中满足所有可能的 depno 值。我建议使用ELSE 分支来保留旧值以防止意外depno s。
  • 是否可以请您编写 sql 查询/案例语句,其中我有 150 个不同的人员 id,我想根据这些 id 更新 150 个人员编号,我将输入人员编号和人员编号手动作为查询中的更新
  • 对不起先生,我很乐意帮助别人,但我不会为你做你的工作;-)。更何况我不太确定你的数据模型。
  • 请看看我的问题。第二部分我将执行它。看起来还好吗
【解决方案2】:

对于条件更新,可以使用多个更新语句,或者在SET子句中使用CASE表达式。

类似的,

更新表 SET schema.column = CASE 当 column1='value1' AND column2='value2' THEN '是' 别的 'N' 结尾

我希望您尝试在此站点上搜索类似的问题,最近有一个问题,this 是我的答案。

【讨论】:

  • 它真的很紧张,我需要更新生产数据库,我以前从未使用过 case 语句,我将用我将要使用的内容来编辑我的问题,如果你能帮助我是否我做对了
【解决方案3】:

您应该可以使用MERGE 语句一次性完成。但是,该声明将相当大:

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

【讨论】:

  • 为什么只合并更新?更新语句就是为此而生的。
【解决方案4】:

如果您有两个表,例如:

CREATE TABLE test_tab_1 (id NUMBER, name VARCHAR2(25));

CREATE TABLE test_tab_2 (id NUMBER, name VARCHAR2(25));

您可以使用UPDATE 声明如下:

UPDATE test_tab_1
SET test_tab_1.name = (SELECT test_tab_2.name FROM test_tab_2
WHERE test_tab_1.id = test_tab_2.id); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    相关资源
    最近更新 更多