oracle 查询不同编号的时间最小记录_投稿 | ORACLE amp; PostgreSql 利用伪列删除完全重复的两行...
作者:繆曉麗
DBA、數據庫愛好者、從業10年。對 DB2、PostgreSQL、Oracle 均有較長的運維經驗。
本次演示的 test 表如下:
01
Oracle 的 rowid
SQL 語句:
DELETE FROM (SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY id) AS rn, id, name
FROM test
)
WHERE t.rn = 2結果:刪除不成功。
原因:delete from 后的子查詢就是視圖,視圖是不支持 DML 操作的。
此時 rowid 派上用場,rowid 是一個偽列,并不實際存儲在表中,也不占用物理數據文件,它只是標記表中每條數據的物理位置。
格式如下:
第一部分 6 位表示:該行數據所在的數據對象的 data_object_id;?
第二部分 3 位表示:該行數據所在的相對數據文件的 id;?
第三部分 6 位表示:該數據行所在的數據塊的編號;?
第四部分 3 位表示:該行數據的行的編號;
可通過 dbms_rowid 系列函數查看 ROWID 的相關信息。
用 ROWID 代替 ID 排序。
SQL 語句:
DELETE FROM testWHERE rowid = (
SELECT ROWID
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY rowid) AS RN, ID
FROM TEST
)
WHERE RN = 1
);
結果:刪除成功。
02
PostgreSQL 的 CTID
PostgreSQL 并沒用 ROWID 偽列,但是有 ctid。
ctid 的結構較 rowid 簡單,如下:?
格式:(Data block, Row);
Data block: 記錄所在的數據塊編號;
Row: 記錄的行編號。
其中 0 代表第 0 塊,1 和 2 代表第 1 行和第 2 行。
刪除思路相同,且 PostgreSQL 支持窗口函數。
SQL 語句:
DELETE FROM testWHERE ctid = (
SELECT ctid
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ctid) AS rn, id, ctid
FROM TEST
)
WHERE rn = 1
);
但是刪除時報錯了:
子查詢需要加別名。
DELETE FROM testWHERE ctid = (
SELECT t.ctid
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ctid) AS rn, id, ctid
FROM TEST
) t
WHERE t.rn = 1
);
結果:刪除成功。
長期征稿·
恩墨學院公眾號開啟長期征稿,只要你有好的技術相關文章,歡迎投稿到:
edu_mkt@enmotech.com
有機會獲得恩墨學院周邊獎勵、恩墨學院精品課程以及培訓優惠卷。
總結
以上是生活随笔為你收集整理的oracle 查询不同编号的时间最小记录_投稿 | ORACLE amp; PostgreSql 利用伪列删除完全重复的两行...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 周线均线设置(周均线设置多少最准确)
- 下一篇: 宽带该怎么安装?中国移动光纤宽带怎么安装