java - Oracle:基于 SELECT 结果的条件更新
问题描述
我只想在 select 语句返回特定值时执行更新。
例子:
给定表:
ItemId | CheckIn
0 0
1 0
2 1
3 1
4 1
我会操作大量的 ItemId,例如 ItemId 1、2、3。
如果所有选定的 ItemId 的 CheckIn 值为 0,那么我应该将 ItemId 的 CheckIn 更新为 1。否则,如果至少有一个选定的 ItemId 为 1,则不应执行更新。
这是否可能在一个单一的 SELECT/UPDATE 语句中实现?!
背景:
CheckIn 值的检查和随后的更新必须是线程安全的 (Java 8)。
可行的是在实际的 UPDATE 语句之前有一个单独的 SELECT FOR UPDATE ,但是我想避免这种情况。
因此,我认为唯一的其他选择是将带有 UPDATE 的 SELECT 放入单个条件查询中,我不确定这是否可能,因此我的问题是。
我正在使用 Java 8 顺便说一句,所以如果您知道如何实现这一点,那么基于 Java 的解决方案也可以。
解决方案
你可能想这样做:
MySQL查询:
UPDATE temp_table
SET CheckIn = 1
WHERE ItemId IN (1, 2, 3)
AND (SELECT sum(derived_table.CheckIn) = 0
FROM (SELECT CheckIn FROM temp_table WHERE ItemId IN (1, 2, 3)) AS derived_table);
甲骨文查询:
UPDATE temp_table
SET CheckIn = 1
WHERE ItemId IN (1, 2, 3)
AND 0 = (SELECT sum(derived_table.CheckIn)
FROM (SELECT CheckIn FROM temp_table WHERE ItemId IN (1, 2, 3)) derived_table);
我创建了一个派生表并使用了一个组函数sum()
来处理这种情况。我已经对其进行了测试,并且它按照问题中的描述工作。
推荐阅读
- html - 如何在几秒钟内淡入文本?
- r - 删除基于带有 NA 的表的过滤器
- c# - 如何获取复选框的实际名称而不是 datarowview
- android - 获取现有的 firebase 子密钥
- linux - Linux:查找命令列出所有内容
- excel - 如何创建每周发送邮件的时间触发器
- c++ - 在 Ubuntu 中从 cpp 程序创建一个新文件
- java - 为瘦 JDBC 客户端配置网络数据加密和完整性
- asp.net-core - Why is my OData 4 Batch not picking up the request body of the last request
- python - Tensorflow Estimator 的训练和预测线程安全吗?