我有下表:
X_ID X_NAME X_TYPE X_SORT_ID
10 BOOK 1 NULL
20 PEN 1 NULL
30 WATCH 2 NULL
5 TENT 3 NULL
我想要实现的是根据X_ID中的值,以1开头的递增值填充X_SORT_ID列。 所以表格看起来像这样:
X_ID X_NAME X_TYPE X_SORT_ID
10 BOOK 1 2
20 PEN 1 3
30 WATCH 2 4
5 TENT 3 1
我只需要为所有现有行更新此表。 将来添加的记录将使用将X_SORT_ID字段设置为下一个值的序列。
我提出的唯一问题并不完全是我需要的。
UPDATE X_ITEMS
SET X_SORT_ID = (SELECT MAX(X_ID) FROM X_ITEMS) + ROWNUM
WHERE X_SORT_ID IS NULL;
我只能使用一个rownum,但这会将值4分配给X_ID = 5的最后一条记录,这不是我想要的。
我感谢任何建议。
答案 0 :(得分:3)
可以使用oracle row_number
:
更新查询
update items ot
set X_SORT_ID =
(
select rw from
(
select X_ID, row_number() over ( order by X_ID ) as rw from items
) it
where it.X_ID = ot.X_ID
)
;
结果表
+------+--------+--------+-----------+
| X_ID | X_NAME | X_TYPE | X_SORT_ID |
+------+--------+--------+-----------+
| 10 | BOOK | 1 | 2 |
| 20 | PEN | 1 | 3 |
| 30 | WATCH | 2 | 4 |
| 5 | TENT | 3 | 1 |
+------+--------+--------+-----------+
<强> sqlfiddle 强>
答案 1 :(得分:1)
使用ROWNUM(伪列)代替上面使用的ROWNUMBER(分析函数)。
应将X_ID定义为主键。
update Grentley GY
set X_SORT_ID =
(select rno from
(select X_ID,rownum as rno from Grentley GY
order by x_id ) AB
where AB.X_ID= GY.X_ID
) ;