Oracle默认排序规则是什么?

    技术2025-01-06  4

    问题

    在不加 order by 的情况下,oracle 的默认排序规则是什么? — 按 ROWID 伪列递增排序。

    示例:

    SELECT ROWID, S.* FROM DEPT S;

    ROWID 是按序递增生成的,唯一标识一条记录的物理位置。

    ROWID 的组成部分:

    -- AAAR3q AAE AAAACH AAA -- 数据对象编号+文件编号+块编号+行编号

    ROWID 的其它作用

    plsqldev 中检索出数据后更新

    在 plsqldev 或其它客户端工具中,一般在 select 后面加 for update ,对检索出的数据进行可视化更新,但其实将 ROWID 作为检索字段也可以达到相同的目的。

    ROWID 虽然可以通过表检索,但不存表里面(所以是伪列,和 ROWNUM 一样),所以不支持删、改操作。

    SELECT S.* FROM DEPT S FOR UPDATE; SELECT ROWID, S.* FROM DEPT S;

    删除重复数据,保留一笔

    既然 ROWID 唯一标识一条记录,自然可以用来删除重复数据。

    先造个数据:

    CREATE TABLE DEPT_REPEAT AS (SELECT * FROM DEPT); INSERT INTO DEPT_REPEAT (SELECT * FROM DEPT); SELECT ROWID, S.* FROM DEPT_REPEAT S ORDER BY S.DEPTNO;

    这 ROWID 的生成也挺有意思的,两条重复数据,就块编号不一样。

    如果要按 DEPTNO、DNAME、LOC 把 ROWDID 小的记录删除的话:

    DELETE FROM DEPT_REPEAT S WHERE S.ROWID IN (SELECT MIN(T.ROWID) FROM DEPT_REPEAT T GROUP BY T.DEPTNO, T.DNAME, T.LOC);

    Processed: 0.010, SQL: 9