Oracle-數據偽列ROWNUM, ROWID
阿新 • • 發佈:2019-02-06
tab 重復數據 改變 做的 tin 根據 取出 條件 操作符
ROWNUM(行號)
根據每行數據進行的一個自動編號,這個編號是動態生成的,而不是固定的。查詢條件改變時,生成的動態編號也不一樣。
在Oracle中,ROWNUM可以做的事情:
1.取出第一行記錄(其他的行記錄不行)
SELECT ROWNUM, empno, ename, job, sal FROM emp WHERE ROWNUM = 1;
SELECT * FROM emp WHERE ROWNUM = 1;
2.取出前N行記錄
SELECT * FROM emp WHERE ROWNUM <= 5;
想要取出前N行記錄很簡單,但是實際操作中往往需要取出第N-M行記錄。
實例1:查詢emp表的6-10行記錄
SELECT * FROM ( SELECT empno, ename, deptno, job, sal,comm, mgr, hiredate, rownum rn FROM emp WHERE rownum <=10) temp WHERE rn > 5;
思路:先查詢前10行數據,經過查詢後,生成的 rownum 列可以作為篩選條件繼續查詢
以上的查詢過程可以看做是一個分頁的結構,當前頁 currenpage, 每一頁的數據行數為 linesize
如果要查詢某一頁的數據,則結構可以寫成
SELECT * FROM (SELECT 列,..., rownum rn FROM表名稱 WHERE rownum <= page*linesize) WHERE rn > (page-1)*linesize;
ROWID(行ID)
AAAR3sAAEAAAACXAAA
對象編號:AAAR3s
保存文件編號:AAE
保存的塊號:AAAACX
保存行號:AAA
範例1:查詢ROWID
SELECT ROWID, empno, ename, job FROM emp;
範例2:利用ROWID找到記錄(任何情況下,都可以用ROWID找到唯一的一行記錄)
SELECT * FROM emp WHERE ROWID = ‘AAAR3sAAEAAAACXAAH‘;
實例2:將表中的重復數據刪除,只保存一條
STEP-1:復制一個dept表為mydept;
CREATE TABLE mydept AS SELECT * FROM dept;
STEP-2:給mydept表增加一些重復數據
INSERT INTO mydept(deptno,dname,loc) VALUES (10,‘ACCOUNTING‘,‘NEW YORK‘); INSERT INTO mydept(deptno,dname,loc) VALUES (10,‘ACCOUNTING‘,‘NEW YORK‘); INSERT INTO mydept(deptno,dname,loc) VALUES (10,‘ACCOUNTING‘,‘NEW YORK‘); INSERT INTO mydept(deptno,dname,loc) VALUES (30,‘SALES‘,‘CHICAGO‘); INSERT INTO mydept(deptno,dname,loc) VALUES (30,‘SALES‘,‘CHICAGO‘);
STEP-3:可以給數據分組,查詢出同樣的數據中最小的ROWID
SELECT deptno,dname,loc, min(rowid) FROM mydept GROUP BY deptno,dname,loc;
STEP-4:上面的查詢結果就是無重復項的所有數據,即不用刪除的數據,可以用NOT IN操作符進行篩選
DELETE FROM mydept WHERE rowid NOT IN (SELECT min(rowid) FROM mydept GROUP BY deptno,dname,loc);
Oracle-數據偽列ROWNUM, ROWID