oracle rowid在表行中的物理标识

WBOY
リリース: 2016-06-07 15:03:36
オリジナル
1165 人が閲覧しました

欢迎进入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在表行中的物理标识

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート