0

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

工作表

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

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

谢谢

4

1 回答 1

0

首先,您的子选择有一个语法错误,它告诉我这不是您尝试运行的确切语句。错误消息非常清楚——在您的实际语句中,子选择有时会返回 NULL。

其次,您可能应该按资源对分区中的行进行编号。

第三,无论如何,您可能都可以使用单个子选择 - 这是基于您发布的声明:

update JOBSTABLE JT
SET RunNumber = 
(SELECT ROW_NUMBER() OVER (partition by resource ORDER BY TIME_STAMP ) 
 from JobsTable where id = JT.ID) 
于 2013-09-13T14:24:21.537 回答