首页 > 解决方案 > 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 的解决方案也可以。

标签: javaoracleoracle11gjava-8

解决方案


你可能想这样做:

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()来处理这种情况。我已经对其进行了测试,并且它按照问题中的描述工作。


推荐阅读