我必须对 USERPRODUCTS 表执行更新
PRODUCTID USERNAME PRODUCTCOUNTRY
1 A US
2 A UK
3 B US
4 B CA
5 B US
6 C IR
7 F IR
8 A IR
我有另一个表 PERSONCOUNTRY,我知道哪个人只能拥有哪个国家/地区的产品许可证,例如
PERSON COUNTRYFORPRODUCTLICENSE
A UK
B US
C IR
现在我想做的是编写一个查询来更新表 USERPRODUCTS 并将人员 A 设置为人员 B,这样只有当 B 对于人员 A 的 USERProductS 中的所有行都有 COUNTRYFORPRODUCTLICENSE 时,查询才应更新,否则不应更新任何行。
例如A 拥有上表中的 COUNTRYFORPRODUCTLICENSE、UK、US 和 IR,但 B 仅有 US 的 COUNTRYFORPRODUCTLICENSE。因此,更新查询应该更新第 1 行(因为 B 拥有美国国家/地区的许可证),但是当它到达第 2 行时,它应该全部回滚,即使是更新的第一行。
我知道这不能通过单一更新来处理
UPDATE USERPRODUCTS userproducts
SET USERNAME = 'B'
WHERE USERNAME = 'A'
AND EXISTS (SELECT * FROM PERSONCOUNTRY personcountry where USERPRODUCTS.PRODUCTCOUNTRY IN (US))
此查询将仅更新 A 在 PRODUCTCOUNTRY 中包含 US 的位置,但不会回滚。
最快的方法是什么?我想在单个更新查询中完成此操作,但不能。我们可以使用 CURSOR 来做到这一点吗?但我必须在 Hibernate 代码中执行此操作
最佳答案
我仍然认为你可以用不存在
来解决这个问题。从您的评论中,我感觉到您正在考虑基于行,但 sql 是基于集合工作的。当您执行 update
语句时,它不会更新行并移至下一行,而是更新符合 where
子句的所有行。
所以沿着这些思路:
UPDATE USERPRODUCTS
SET USERNAME = 'B'
WHERE USERNAME = 'A'
AND EXISTS (
SELECT NULL
FROM PERSONCOUNTRY PC
WHERE PC.COUNTRYFORPRODUCTLICENSE IN ('US')
AND PC.PERSON = USERPRODUCTS.USERNAME
)
AND NOT EXISTS (
SELECT NULL
FROM PERSONCOUNTRY PC
WHERE PC.COUNTRYFORPRODUCTLICENSE NOT IN ('US')
AND PC.PERSON = USERPRODUCTS.USERNAME
)
关于java - 如果单行 SQL 中不满足条件,则回滚整个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36301074/