在复杂的操作(某些数据库合并)之后,我有一个需要根据时间戳更新的表。
JobsTable
Id Time_stamp Resource RunNumber
121 1 A 1
122 2 A 1
123 3 B 1
124 4 B 1
125 5 A 2
重点是根据时间戳为每个资源逐步更新RunNumber列。所以最终预期的结果是:
Id Time_stamp Resource RunNumber
121 1 A 1
122 2 A 2 //changed
123 3 B 1
124 4 B 2 //changed
125 5 A 3 //changed
我尝试过多种方式。由于DB2更新不支持Join或With语句,我尝试过类似的方法:
update JOBSTABLE JT
SET RunNumber =
(SELECT RunNumber
FROM (Select ID, ROW_NUMBER() OVER (ORDER BY TIME_STAMP ) RunNumber from JobsTable, ORDER BY TIME_STAMP) AS AAA
WHERE AAA.ID = JT.ID)
WHERE ID = ?
错误:
不允许将NULL值分配给NOT NULL列“TBSPACEID = 6,TABLEID = 16,COLNO = 2”.SQLCODE = -407,SQLSTATE = 23502,DRIVER = 3.64.82 SQL代码:-407 ,SQL状态:23502
这甚至可能吗? (我的目标是在单个查询中执行此操作,而不是使用游标等。)
谢谢
答案 0 :(得分:0)
首先,您的subselect有一个语法错误,它告诉我它不是您尝试运行的确切语句。错误消息非常清楚 - 在您的实际语句中,subselect有时会返回NULL。
其次,您应该按资源对分区内的行进行编号。
第三,你可以用一个子选择做 - 这是基于你发表的声明:
update JOBSTABLE JT
SET RunNumber =
(SELECT ROW_NUMBER() OVER (partition by resource ORDER BY TIME_STAMP )
from JobsTable where id = JT.ID)