我有3个UPDATE个语句(更新多个列),我想对一个id的列表执行,而不必对每个id逐个运行3个更新语句.

以下是我需要对一堆id运行的3个更新语句:

-- store ContractDate value in temp col
update tval set temp_col = (select val from tval where id = 402280209 and fid = 3782) where id = 402280209 and fid = 3782


-- Replace ContractDate with maturityDate
update tval set val= (select val from tval where fid = 3771 and id = 402280209) where fid = 3782 and id = 402280209


-- set MaturityDate to ContactDate
update tval set val = (select temp_col from tval where id = 402280209 and fid = 3782) where id = 402280209 and fid = 3771

我有一个id的列表,我需要运行以上3更新语句对.是否可以将上述内容作为批处理(即在一个查询中)运行?

我的tval表看起来像这样:

    id       fid              ts                      val                 temp_col
402280209   3765    2021-09-20 00:00:00.000   2023-12-19 00:00:00.000   
402280209   3771    2021-09-20 00:00:00.000   2023-09-20 00:00:00.000   <---- I would like to swap this value
402280209   3782    2021-09-20 00:00:00.000   2023-12-19 00:00:00.000   <----- with this value

我试图避免的是为每id手动运行上面的操作.

所以我想要的结果是:

    id       fid              ts                      val                 temp_col
402280209   3765    2021-09-20 00:00:00.000   2023-12-19 00:00:00.000   
402280209   3771    2021-09-20 00:00:00.000   2023-12-19 00:00:00.000   
402280209   3782    2021-09-20 00:00:00.000   2023-09-20 00:00:00.000   

推荐答案

从后面的说明来看,您似乎希望交换两个不同的rows not列中的值.这就更复杂了.一个选项是使用(constructed?)表以连接源行和目标行.只要这两个方向都存在于这个连接表中,那么它将正确地交换它们.

update tval
set val = source.val
from (values
    (3771, 3782),
    (3782, 3771)
) v(fidTarget, fidSource)
join tval source
  on source.fid = v.fidSource
where tval.id = 402280209
  and v.fidTarget = tval.fid
  and source.id = tval.id;

db<>fiddle

Sql相关问答推荐

基于时间的SQL聚合

如何以"% m—% d"格式对生日列表进行排序,以查找与今天最近的日期?

使用`lag()`获取上一个时间戳

基于多列比较连接两个表

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

获得第三名或最老的记录

NULL-生成的列中连接的字符串的输入

将Dense_RANK列为聚合(非解析)函数(&A)

删除所有订单中可用的重复值

Postgresql - WHERE 中的 MAX 标准 - 初学者问题

如何在Hive SQL中分别按多列进行分组?

将最近的结束日期与开始日期相匹配

Postgres,使用 select 插入多个值

清理 XML 数据

比使用NOT EXISTS更高效的SQL删除方法是什么?

根据行号将列转置为没有任何id或键列的行

如何显示最常引用条目的详细信息

奇怪的甲骨文行为

如何在 SQL Server 中参数化 Select top 'n'

SQL中所有先前日期的累计总和