在Oracle DBMS中使用单个SQL查询更新多个行

时间:2013-10-24 12:08:22

标签: sql oracle sql-update

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

ID   Name  City  zip

1    xxx   wer   134

2    yyy   qwe   234

3    zzz   ert   256

4    www   qwe   567

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

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

会更新一行,如果我还想用一个查询来更新ID为1和4的行,那么ZIP会有什么不同?

3 个答案:

答案 0 :(得分:5)

如果您希望使用一个查询将多行更新为同一个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')。

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

答案 1 :(得分:2)

请尝试使用不同的值更新案例条件:

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

答案 2 :(得分:2)

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

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(如果您的客户端库可用)。