当前位置: 首页 > 知识库问答 >
问题:

SQL更新多行,每行都有条件[关闭]

董奇思
2023-03-14

< b >想改进这个问题?通过编辑此帖子添加详细信息并澄清问题。

我有一个包含列A,B,C的表。

如果A和B(A和B一起是唯一的)我想更新列C,因此伪代码如下所示:

update table 
set (a = 1, b = 1, c = 1000)
    (a = 2, b = 2, c = 2000)
    (a = 3, b = 3, c = 3000)
where a and b matches columns

我该如何用SQL编写?

共有3个答案

堵宏毅
2023-03-14

如果是指 a 等于 b 时

UPDATE t 
SET c = 1000 * a
WHERE a = b;

对于任何rdbms。
参见演示

濮阳征
2023-03-14

多重更新适用于任何RDBMS

update yourtable set c = 1000 where a = 1 and b = 1
update yourtable set c = 2000 where a = 2 and b = 2
update yourtable set c = 3000 where a = 3 and b = 3

人们会假设UPDATE语句应该是非常标准的。
但是当从表或子查询更新时,语法可能会有所不同。

这在MS Sql Server中有效

update t
set c = q.c
from yourtable t
join (values 
   (1, 1, 1000)
  ,(2, 2, 2000)
  ,(3, 3, 3000)
) q(a, b, c)
on t.a = q.a and t.b = q.b

这在Postgresql中有效

update yourtable t
set c = q.c
from 
(values 
   (1, 1, 1000)
  ,(2, 2, 2000)
  ,(3, 3, 3000)
) q(a, b, c)
where q.a = t.a and q.b = t.b

这在MySql中工作

update yourtable t
join 
(
   select 1 as a, 1 as b, 1000 as c
   union all select 2, 2, 2000
   union all select 3, 3, 3000
) q on q.a = t.a and q.b = t.b
set t.c = q.c

这适用于Oracle RDBMS

update yourtable t 
set t.c = 
(
   select q.c
   from 
   (
      select 1 as a, 1 as b, 1000 as c from dual
      union all select 2, 2, 2000 from dual
      union all select 3, 3, 3000 from dual
   ) q
   where q.a = t.a and q.b = t.b
)
姚自强
2023-03-14

我认为您可以使用< code>case表达式:

update table 
    set c = (case when a = 1 and b = 1 then 1000
                  when a = 2 and b = 2 then 2000
                  when a = 3 and b = 3 then 3000
             end)
where (a = 1 and b = 1) or (a = 2 and b = 2) or (a = 3 and b = 3);
 类似资料:
  • 问题内容: 我正在尝试运行一个更新查询,它将在sql中看起来像这样: 我正在尝试使用 Criteria 这样重新创建查询: 这行不通,因为满足该条件的行很多,我的独特结果是我猜这里的问题。如何将其转换为符合条件的所有行的更新。我不想使用HQL查询,而是使用Criteria来执行。 问题答案: 始终建议执行批量操作非常接近数据库,除非需要,否则我们不需要在会话中保留更新的对象,因此,在执行批量操作时

  • 问题内容: 假设有一个完全填充的数据String [n] [3] myData数组。 我想做这个: 显然,我已经遗漏了很多东西,但是我想尽可能简洁地表达这个想法。 有一个简单的方法可以在单个DB命令中执行此操作吗?一个不太简单的方法怎么样? 编辑:数据不是来自另一个表(这是Web表单提交-多项选择考试)。 由于该应用是面向Web的,因此必须是防注入的。参数化查询是我首选的处理方式。 我正在使用MS

  • 问题内容: 我试图像这样更新我的表: 我可以做一个,但是会发送50多个单独的查询,这非常慢。这就是为什么我希望将其合并为1个大查询。 (我确实为每行使用一个 id ,但是 game_id , x 和 y 的组合才是我用来标识所需行的方法。) 这里描述了来自codeIgniter的update_batch()函数: 使用CodeIgniter更新批处理 是有用的,并且几乎是完美的,但是它仅允许1个单

  • 问题内容: 我有一张表: 在UI上更新消息后,我调用存储的proc来更新该表。在某些情况下,用户可能仅更新主题,而在其他情况下,仅更新正文。我希望此存储的过程仅更新已更改的内容,因此我还传递了一些标志,用于显示主题或正文是否已更新: 现在我很困惑如何构建条件语句。我的第一个想法是使用: …但这似乎不是正确的语法,因为它必须是分配的右侧。 有什么想法可以做到吗?(请记住,实际上有6个参数可以更新,而

  • 问题内容: 使用in 时可以执行更新吗?例如: 问题答案: 有一个非常强大的功能,称为: [15.4。DML风格的操作](http://docs.jboss.org/hibernate/orm/4.3/manual/en- US/html/ch15.html#batch-direct) 来自doc的小引用: …但是,Hibernate提供了通过Hibernate查询语言执行批量SQL样式DML语句

  • 问题内容: 我在Postgres 11.3数据库中有一个带有列的表。 尝试更新嵌套数组名称中的所有对象。 如果路径是对象,则应将路径从对象更新为具有以下值的字符串: 如果不存在该路径,则该对象应保持不变。 使用查询测试设置:小提琴链接 所需结果: 我已经修改了查询并链接到小提琴中。有人可以看看是否正确吗? 问题答案: 平原应该有所作为。 db <>在这里 拨弄 (Postgres 11!) 为了同