如何根据同一个表中另一列的顺序更新列中的所有值?

时间:2016-08-17 15:09:49

标签: sql database oracle sql-update sequence

我在Oracle DB中有一个这样的表。

S_Name    S_NO   S_SID
Michael   (NULL)  C40
Jay       (NULL)  A44
David     (NULL)  G71
Chris     (NULL)  Y53
...       ...     ...

我想根据订购的S_SID更新所有S_NO。 这意味着(A44> C40> G71> Y53)

S_Name    S_NO   S_SID
Michael   2       C40
Jay       1       A44
David     3       G71
Chris     4       Y53
...       ...     ...

1 个答案:

答案 0 :(得分:2)

您可以使用ROW_NUMBER()获取订单,以便选择

 SELECT S_name, S_SID, ROW_NUMBER() OVER (ORDER BY S_SID DESC) as RN

为您提供刚才更新的价值。

<强>更新

此代码

UPDATE TABLE SET S_NO = (SELECT ROW_NUMBER() OVER(ORDER BY S_NO) AS RN FROM TABLE)

不连接回表,因此服务器假定您只想从子查询中获取一个值并将其分配给所有行。

您需要加入索引:

UPDATE TABLE AS MAIN_TABLE
  SET MAIN_TABLE.S_NO = (SELECT ROW_NUMBER() OVER(ORDER BY S_NO) AS RN 
              FROM TABLE AS SUB_TABLE
              WHERE MAIN_TABLE.INDEX_COLUMN = SUB_TABLE.INDEX_COLUMN
              )