欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

oracle rowid在表行中的物理标识

程序员文章站 2022-03-25 17:08:31
...

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 当然最常用的是用rowid去除重复: 查出重复数据: select a.rowid,a.* from 表名 a where a.rowid != ( select max(b.rowid) from 表名 b where a.字段1 = b.字段1 and a.字段2 = b.字段2 ) 删

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入


当然最常用的是用rowid去除重复:
查出重复数据:
select a.rowid,a.* from 表名 a
where a.rowid !=

select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2

删除重复数据:
delete from 表名 a
where a.rowid !=

select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2

对于整行都重复的那么,可以使用distinct函数。
以下介绍下postgresql的ctid
testuser=# select ctid,* from t1 limit 1;
ctid | a
-------+-----------
(0,1) | 100000000
和oracle rowid类似也是一个物理字段,自动生成,不过结构和oracle rowid不一样,可以看到是(blockid,itemid)
ctid在数据更改后也会变化。
利用ctid去除重复数据:
建立测试表,插入数据:
testuser=# create table t2 (id int,name varchar(20));
CREATE TABLE
testuser=# insert into t2 values (1,'apple');
INSERT 0 1
testuser=# insert into t2 values (1,'apple');
INSERT 0 1
testuser=# insert into t2 values (1,'apple');
INSERT 0 1
testuser=# insert into t2 values (2,'orange');
INSERT 0 1
testuser=# insert into t2 values (2,'orange');
INSERT 0 1
testuser=# insert into t2 values (2,'orange');
INSERT 0 1
testuser=# insert into t2 values (2,'orange');
INSERT 0 1
testuser=# insert into t2 values (3,'banana');
INSERT 0 1
testuser=# insert into t2 values (3,'banana');
INSERT 0 1
testuser=# select * from t2;
id | name
----+--------
1 | apple
1 | apple
1 | apple
2 | orange
2 | orange
2 | orange
2 | orange
3 | banana
3 | banana
查询重复的数据:
testuser=# select ctid,* from t2 where ctid in (select min(ctid) from t2 group by id);
ctid | id | name
-------+----+--------
(0,1) | 1 | apple
(0,4) | 2 | orange
(0,8) | 3 | banana
删除重复数据并查看结果:
testuser=# delete from t2 where ctid not in (select min(ctid) from t2 group by id);
DELETE 6
testuser=# select * from t2;
id | name
----+--------
1 | apple
2 | orange
3 | banana
(3 rows)

[1] [2]

oracle rowid在表行中的物理标识