在不加 order by 的情况下,oracle 的默认排序规则是什么? — 按 ROWID 伪列递增排序。
示例:
SELECT ROWID, S.* FROM DEPT S;ROWID 是按序递增生成的,唯一标识一条记录的物理位置。
ROWID 的组成部分:
-- AAAR3q AAE AAAACH AAA -- 数据对象编号+文件编号+块编号+行编号在 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);