根据来自不同列

时间:2015-07-11 09:20:11

标签: sql oracle sql-update

我有下表:

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的最后一条记录,这不是我想要的。

我感谢任何建议。

2 个答案:

答案 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(分析函数)。

Read here for difference

  

应将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
) ;

SQL Fiddle

Sample