首页 文章

初始化SQL行的顺序

提问于
浏览
0

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

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

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

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

UPDATE table_x SET sequence_number = ...

升级数据库时的某种形式 .

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

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

EDIT

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

UPDATE table_x SET sequence_number = ... -- for all rows ORDER BY name

1 回答

  • 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块中删除提交,以确保您没有错误地更新它 .

相关问题