sql - 将 Fetch First 与案例表达式一起使用
问题描述
DB2 UDB v11.x。
是否可以在使用 CASE 的 UPDATE 查询中使用 FETCH FIRST?我有点理解为什么它不起作用,但想知道是否有办法。例如:
db2 "UPDATE mytable SET cstate = CASE WHEN cstate = 801 THEN cstate = 1 AND rstate = 1 WHEN cstate = 804 THEN cstate = 4 AND rstate = 4 END FETCH FIRST 20000 ROWS ONLY"
这导致一次只更改一行。
试过:
db2 "UPDATE mytable SET cstate = CASE WHEN cstate = (SELECT cstate FROM mytable WHERE cstate = 801 FETCH FIRST 20000 ROWS ONLY) THEN cstate = 1 AND rstate = 1 WHEN cstate = (SELECT cstate FROM mytable WHERE cstate = 804 FETCH FIRST 20000 ROWS ONLY) THEN cstate = 4 AND rstate = 4 END"
这得到:
SQL0811N The result of a scalar fullselect, SELECT INTO statement, or VALUES
INTO statement is more than one row
有什么办法可以做到这一点?希望不要将其拆分并重复表格两次(或一次必须进行一次更新)。
解决方案
这将是最简单的方法
UPDATE
( SELECT * FROM
( SELECT
cstate
, rstate
, CASE WHEN cstate = 801 THEN 1 WHEN cstate = 804 THEN 4 ELSE cstate END new_cstate
, CASE WHEN cstate = 801 THEN 1 WHEN cstate = 804 THEN 4 ELSE rstate END new_rstate
FROM
mytable
)
WHERE
cstate IS DISTINCT FROM new_cstate
OR rstate IS DISTINCT FROM new_rstate
FETCH FIRST 20000 ROWS ONLY
)
SET cstate = new_cstate
, rstate = new_rstate
继续运行它,直到它没有更新任何行。
推荐阅读
- bash - 在 mac 终端上找不到导出命令
- r - Xaringan 模块演示
- python - 如何根据字典对列表中的单词进行分类?
- spring - 当我有两种类型的用户时,如何使用 spring security 保护 rest api
- java - 为什么除以 1000000000 时没有小数位
- c# - 使用自动身份验证将登录用户重定向到新网站
- tensorflow - 扁平化输入层形状
- python - Matplotlib中的散点图Y轴数字范围问题
- django - Django中类别帖子的问题分页
- amazon-web-services - 使用 apache camel 从 DynamoDB 中检索项目