初始化SQL行的顺序

时间:2017-05-24 10:56:50

标签: sql oracle oracle11g

目前,我们总是按特定顺序获取表格的行:

SELECT ... FROM table_x WHERE ... ORDER BY ...

但是,我们希望用户可以通过拖放来定制订单(是的,在这种情况下它实际上是有意义的,where-clause通常确保它只有5-30行)。为此,我们创建了列sequence_order,从现在开始,行将在选择时对其进行排序。

问题是我们已经在table_x中拥有数百万行。当我们推出这项新功能时,我们希望在用户进行任何自定义之前,订单最初与以前相同。即我们需要执行

UPDATE table_x SET sequence_number = ...
升级数据库时的某种

问题是我甚至没有看到如何使用原始order-by-clause来确保以正确的顺序更新行。这是可能的,还是我需要使用更高级别的脚本?

我们使用Oracle数据库,因此Oracle特定的构造是可以的。

修改

作为简化示例:我需要一个语句,按照sequence_order列的字母顺序将1,2,3 ...写入table_x的{​​{1}}列。伪SQL中有类似的东西:

name

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您希望在新列sequence_number中添加序列,该列应为order by name

我可以想到的一种方法如下,但如果name重复,它会跳过一些数字。

创建序列

create sequence myseq01 start with 1 increment by 1;

现在运行此plsql块。

declare
cursor crsr is select name from table_x order by name;
BEGIN
for rec in crsr loop
 update table_x set sequence_number = myseq01.nextval where name=rec.name;
end loop;
-- COMMIT; --Use it only when you understand what the PLSQL block is doing.
END;

我强烈建议只有在能够按顺序跳过某些数字时才会使用它(但它们将是唯一的)。

还要确保auto_commit已关闭并从PLSQL块中删除提交,以确保您没有错误地更新它。