【问题标题】:Updating a number of row with a single SQL query in Oracle DBMS在 Oracle DBMS 中使用单个 SQL 查询更新多个行
【发布时间】:2013-10-24 12:08:22
【问题描述】:

我有一个表 A,其结构如下:

ID   Name  City  zip

1    xxx   wer   134

2    yyy   qwe   234

3    zzz   ert   256

4    www   qwe   567

现在我想用一个 SQL 查询更新多行。例如查询:

UPDATE A
   SET zip= '355'
   WHERE id= '2';

将更新一行,如果我还想通过一个查询更新 ID 为 1 和 4 的行,ZIP 不同,该怎么办?

【问题讨论】:

  • 请澄清,“ZIP 的不同之处”。
  • 您要更新哪些值?您将从哪里获得价值?如果是另一个表,那么您可以进行相关更新。
  • @Colin'tHart 例如,我想将 id 为 1,3,4 的行更新为我想直接在查询中输入的 zip。
  • @DanBracuk 我错了。对不起!我将删除上面的评论并编辑问题。

标签: sql oracle sql-update


【解决方案1】:

如果您的意思是要通过一个查询将多行更新到同一个 zip,您可以使用以下内容:

UPDATE A
   SET zip= '355'
   WHERE id in ('1','4');

但是,如果您的意思是要将多行更新为 zip 值,那么如果没有一些逻辑位于哪个 id 应该获取哪个 zip 之后,就无法完成。例如,如果你只想做几个不同的值,你可以使用类似的东西:

UPDATE A
   SET zip= decode(id,'1','100','4','400')
   WHERE id in ('1','4');

这会将 id 为“1”的任何行的 zip 设置为“100”,将 id 为“4”的任何行设置为“400”,依此类推。您可以根据需要添加任意数量的参数。如果您想要任何未列出的默认值,只需将其添加到末尾,例如decode(id,'1','100','4','400','999') 将设置任何不是 id '1' 或 '4' 的(但未在 where 语句中排除为 '999')。

如果您有很多不同的值,那么我建议您创建一个参考数据表并在您的更新语句中从该表中选择一个子查询。

【讨论】:

  • 感谢您的建议,但我想将不同的行更新为不同的 zip 值。谢谢你的建议,我会努力的。
  • 没问题,如果您决定走参考数据路线并需要任何帮助,请告诉我。
【解决方案2】:

请尝试用不同的值更新 case 条件:

UPDATE A 
 SET zip=case when ID='1' then 'Value1' else 'Value2' end 
WHERE ID IN ('1', '4');

【讨论】:

  • 非常感谢您的建议。
【解决方案3】:

假设为给定 ID 找到正确 ZIP 的逻辑在您的客户端代码中,您可以动态生成一个匿名块,并在那里打包适当的更新,如下所示:

BEGIN
    UPDATE A SET zip= '255' WHERE id= '1';
    UPDATE A SET zip= '355' WHERE id= '2';
    UPDATE A SET zip= '455' WHERE id= '4';
END;

(注意:在实际代码中使用绑定参数。)

这将在到服务器的单次往返中执行,但包含大量(文本)开销。如果您需要更新大量的行,请考虑array binding(如果您的客户端库可用)。

【讨论】:

  • 为什么不生成单个 DML 语句 update a set zip = decode(id, '1', '255', '2', '355', '4', '455') where id in ('1','2','4'); 呢?无论如何,要小心 SQL 注入。
猜你喜欢
  • 1970-01-01
  • 2016-11-02
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多