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