DB2 - 基于时间戳的更新增量

时间:2013-09-13 13:14:01

标签: db2 timestamp sql-update increment

在复杂的操作(某些数据库合并)之后,我有一个需要根据时间戳更新的表。

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

这甚至可能吗? (我的目标是在单个查询中执行此操作,而不是使用游标等。)

谢谢

1 个答案:

答案 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)