要想處理Oracle數據庫查詢和取出表中重復記錄,需要先了解ROWID---偽列。
ROWID 是一種數據類型,他是用基於64位編碼的18個字符來唯一標識一條記錄的物理位置的一個ID,類似於表的主鍵,ROWID一般情況是按照遞增的順序排序的,默認情況下
索引也是按照ROWID的順序來顯示的,所以對於完全相同的兩條記錄,結果會按照ROWID的順序來進行排序。
ROWID可以被查詢,例如:select rowid,a.* from emp a.
這次主要是利用ROWID來進行重復數據的處理,所以ROWID不做過於詳細的介紹,下面說下利用ROWID處理重復數據。
假設emp表存儲如下:
IDNO NAME SEX AGE
1101 Sherry 1 25
1102 Nancy 1 26
1101 Sherry 1 25
查詢重復記錄SQL如下:
select *
from emp a
where (rowid,a.IDNO) not in (select max(rowid),a.IDNO
from emp a
group by a.IDNO)
sql解讀:紅色字體會查詢出來不重復的記錄,那么關聯外面的,rowid不在后面結果集的,即重復記錄。
可以自己擴展,比如我要去除重復記錄ROWID最大或者最小的值等等,了解遠原理之后,變形SQL即可。
另外可以看下下面的SQL
select gv.idno, gv.name
from dept fg,
(select g.idno, g.name
from emp g
where (rowid, g.idno) in
(select max(rowid), t.idno
from emp t
group by t.policy_code)
) gv
where fg.idno=gv.idno
and fg.deptno='001'