在oracle資料庫中有一表t_foo,表中有一欄位id,如何高效地刪除表中id欄位的重複資料 ?
解答:因為oracle提供了兩個偽例,乙個是rownum,另乙個是rowid,他們的應用分別是分頁查詢和效能調優上。
這裡需要使用到rowid,因為它是oracle資料庫自動為記錄新增唯一的18位編號,不會隨著查詢而改變。
--思路:
--先檢視rowid
select t.id,rownum,rowid from t_foo t
2 1 aaam4raaeaaaai0aaa
1 2 aaam4raaeaaaai1aaa
3 3 aaam4raaeaaaai1aab
4 4 aaam4raaeaaaai1aac
5 5 aaam4raaeaaaai1aae
5 6 aaam4raaeaaaai3aaa
5 7 aaam4raaeaaaai3aab
4 8 aaam4raaeaaaai3aac
--根據重複字段分組,找出最大的rowid值
select t.id,max(rownum),max(rowid) from t_foo t group by t.id;
1 2 aaam4raaeaaaai1aaa
2 1 aaam4raaeaaaai0aaa
4 8 aaam4raaeaaaai3aac
5 7 aaam4raaeaaaai3aab
3 3 aaam4raaeaaaai1aab
--使用子查詢關聯查詢,找出比max(rowid)小的重複值
select b.id,rownum,rowid from t_foo b where rowid< (select max(rowid) from t_foo where id=b.id);
4 1 aaam4raaeaaaai1aac
5 2 aaam4raaeaaaai1aae
5 3 aaam4raaeaaaai3aaa
--直接刪除那些重複的值,若資料量較大,建議通過臨時表來進行資料操作,也就是先儲存不重複資料,再drop/create table,然後insert into
delete from t_foo b where rowid< (select max(rowid) from t_foo where id=b.id);
備註:關於索引,只對查詢有用,對insert into,delete,update 的操作反而有影響
sql 刪除資料
drop table student back 這樣就刪除表了,這樣的刪除不僅會刪除表中的資料,還包括表結構 字段 檢視 索引 觸發器和依賴的約束等等。此方法慎用!truncate table student back 這樣只是刪除表中的所有資料,會保留表結構 字段 約束 索引等等,但是不能加 wh...
用SQL刪除資料
使用 delete 命令可以 刪除資料,使用 truncate 命令可以刪除整表資料但保留結構。4.7.1 刪除記錄 在 命令編輯區 輸入 delete from scott.test where empno 7500 and empno 8000 然後單擊 執行 按鈕,出現如圖4.47所示的結果。...
SQL語句中 刪除資料
老大 drop 出沒場合 droptable tb tb表示資料表的名字,下同 絕招 刪除內容和定義,釋放空間。簡單來說就是把整個表去掉.以後要新增資料是不可能的,除非新增乙個表 老二 truncate 出沒場合 truncatetable tb 絕招 刪除內容 釋放空間但不刪除定義 表的資料結構還...