精华内容
下载资源
问答
  • ROWIDORACLE中的一个重要的概念。用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。ROWID它是一个伪列,它并不实际存在于表中。它是ORACLE在读取表中...

    ROWID是ORACLE中的一个重要的概念。用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。ROWID它是一个伪列,它并不实际存在于表中。它是ORACLE在读取表中数据行时,根据每一行数据的物理地址信息编码而成的一个伪列。所以根据一行数据的ROWID能找到一行数据的物理地址信息。从而快速地定位到数据行。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。

    要理解索引,必须先搞清楚ROWID。

    B-Tree索引的每个索引条目具有两个字段。第一个字段表示索引的键值,对于单列索引来说是一个值;而对于多列索引来说则是多个值组合在一起的。第二个字段表示键值所对应的记录行的ROWID。所以索引能加快查询速度!

    索引值→ROWID->将ROWID换算成一行数据的物理地址->得到一行数据

    一、ROWID的格式:

    16c286d910427e01a2ebae8480c412d1.png

    第一部分6位表示:该行数据所在的数据对象的 data_object_id;

    第二部分3位表示:该行数据所在的相对数据文件的id;

    第三部分6位表示:该数据行所在的数据块的编号;

    第四部分3位表示:该行数据的行的编号;

    索引就是保存了rowid后三个部分的信息。索引是物理存在的,而rowid是伪列。所以索引可以用来快速地定位到数据行。

    data_object_id

    下面以SAKILA数据库的ACTOR表为例

    这里我们要注意将 data_object_id与 object_id区分开来,前者是oracle为它的每一个对象唯一分配的id,而后者与表ACTOR对应的“段”有关,是存放表tt的段的id,也就是与存放表tt中数据的物理位置有关:

    select owner,object_id,data_object_id,status from dba_objects where object_name='ACTOR';

    d22fa32a782a7088384ceceebf394937.png

    alter table ACTOR move tablespace users;

    select owner,object_id,data_object_id,status from dba_objects where object_name='ACTOR';

    146130fe90b8b60732edad227c40db0c.png

    我们看到当表ACTOR move到了users表空间时,段发生了改变,物理位置发生了变化,从而 DATA_OBJECT_ID也发生了变化。我们知道表是存放在“表段”中的,索引是存放在“索引段”中的。DATA_OBJECT_ID就是表示存放数据的“数据段对象的id”

    相对文件编码

    关于相对文件编码和绝对文件编号:相对文件id是指相对于表空间,在表空间唯一,绝对文件是指相当于全局数据库而言的,全局唯一;

    select file_name,file_id,relative_fno from dba_data_files;

    eee0d33ae30499ce6ed71853c824a4b0.png

    rowid采用64进制来编码

    编码方法是:A~Z表示0到25;a~z表示26到51;0~9表示52到61;+表示62;/表示63;刚好64个字符。

    Base64编码表

    码值

    字符

    码值

    字符

    码值

    字符

    码值

    字符

    0

    A

    16

    Q

    32

    g

    48

    w

    1

    B

    17

    R

    33

    h

    49

    x

    2

    C

    18

    S

    34

    i

    50

    y

    3

    D

    19

    T

    35

    j

    51

    z

    4

    E

    20

    U

    36

    k

    52

    0

    5

    F

    21

    V

    37

    l

    53

    1

    6

    G

    22

    W

    38

    m

    54

    2

    7

    H

    23

    X

    39

    n

    55

    3

    8

    I

    24

    Y

    40

    o

    56

    4

    9

    J

    25

    Z

    41

    p

    57

    5

    10

    K

    26

    a

    42

    q

    58

    6

    11

    L

    27

    b

    43

    r

    59

    7

    12

    M

    28

    c

    44

    s

    60

    8

    13

    N

    29

    d

    45

    t

    61

    9

    14

    O

    30

    e

    46

    u

    62

    +

    15

    P

    31

    f

    47

    v

    63

    /

    二、使用rowid访问数据的执行计划

    SELECT t.*, ''||t.ROWID FROM "SAKILA"."ACTOR" t;

    ff88010c2145613a35028295738ec307.png

    EXPLAIN PLAN FOR

    select * FROM ACTOR where rowid='AAAYEVAAJAAAACrAAA';

    select * from table(DBMS_XPLAN.DISPLAY)

    efd94ab604e78b7df63319aab128fb43.png

    三、例子:如何从rowid计算得到obj#,rfile#,block#,row#

    我们演示一下具体的计算方法:

    SELECT t.*, ''||t.ROWID FROM "SAKILA"."ACTOR" t;

    a1e8b2782efb9c5f07ff9ff20502a90c.png

    表sakila的 data_object_id 为 AAAYEVAAJAAAACrAAA的前6位:AAAYEV,那么我们来计算一下 AAAYEV的值到底是多少:

    查询Base64编码表

    码值

    字符

    0

    A

    24

    Y

    4

    E

    21

    V

    select 24 * 64 * 64 + 4 * 64 + 21 from dual;

    AAAYEV=24 * 64 * 64 + 4 * 64 + 21=98581

    然后我们查询字典表,看两种方法得到的值是否相等:

    select owner,object_id,data_object_id,status from dba_objects where object_name='ACTOR';

    f504bfef0013ef0e764daa7fce9a54f8.png

    我们看到通过rowid计算得到的data_object_id和通过字典表查到的值相等!

    表ACTOR的相对文件编号为 AAAYEVAAJAAAACrAAA的中的 AAJ,显然查表可知 AAJ= 9;

    我们在再来查询字典表:

    c7eddacf1166631ee17e6a899c979bf1.png

    可以看到字典表显示relative_fno为9的数据文件为C:\APP\ORACLE\ORADATA\ORCL\PDBORCL\SAMPLE_SCHEMA_USERS01.DBF

    查询当前数据库中的users表空间和对应的数据文件

    select file_name,tablespace_name from dba_data_files;

    0fad0014be1eb15e186b2c90097c519e.png

    两者结果一致。

    而我们前面执行过:alter table ACTOR move tablespace users;所以两种方式得到的结果是一致的。

    表ACTOR中的第一行数据存放的block的编号为 AAAYEVAAJAAAACrAAA中的 AAAACr,而AAAACr =2*64+43=171

    表ACTOR中的第一行数据存放的行的编号为AAAYEVAAJAAAACrAAA中的 AAA,显然值为0,即第一行。

    我们也可以通过Oracle提供的存储过程来计算出上面的值:

    SELECT

    dbms_rowid.rowid_object (ROWID) data_object_id,

    dbms_rowid.rowid_relative_fno (ROWID) relative_fno,

    dbms_rowid.rowid_block_number (ROWID) block_no,

    dbms_rowid.rowid_row_number (ROWID) row_no

    FROM

    ACTOR;

    3c83331a2f8a4d3c3b23835db4beed08.png

    显然这个结果和我们手动计算的结果是一致的。

    参考

    oracle中的rowid和数据行的结构

    在oracle数据库系统中每一行都有一个rowid,oracle数据库系统就是利用rowid来定位数据行的.rowid也是oracle中内置的一个标量数据类型 rowid有一下特点; 是数据库中每一行 ...

    Oracle中的rowid rownum

    1. rowid和rownum都是虚列 2. rowid是物理地址,用于定位oracle中具体数据的物理存储位置 3. rownum则是sql的输出结果排序,从下面的例子可以看出其中的区别. rowi ...

    mysql中实现oracle中的rowid功能

    mysql中没有函数实现,只能自己手动添加变量递增  := 就是赋值,只看红色字体就行 select @rownum:=@rownum+1,img.img_path,sku.sku_name from ...

    mysql中实现行号,oracle中的rowid

    mysql中实现行号需要用到MYSQL的变量,因为MySql木有rownumber. MYSQL中变量定义可以用 set @var=0 或 set @var:=0 可以用=或:=都可以,但是如果变量用 ...

    [转载]mysql中实现行号,oracle中的rowid

    mysql中实现行号需要用到MYSQL的变量,因为MySql木有rownumber. MYSQL中变量定义可以用 set @var=0 或 set @var:=0 可以用=或:=都可以,但是如果变量用 ...

    【转】oracle中rowid的用法 (全面)

    ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置. ROWID可以分为物理rowid和逻辑rowid两种.普通的堆表中的rowid是物理rowid,索引组织表 ...

    oracle中rownum和rowid的区别

    rownum和rowid的区别总括: rownum和rowid都是伪列,但是两者的根本是不同的. rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownu ...

    Oracle中的rownum,ROWID的 用法

    1.ROWNUM的使用——TOP-N分析 使用SELECT语句返回的结果集,若希望按特定条件查询前N条记录,可以使用伪列ROWNUM. ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的 ...

    (转)Oracle中的rownum,ROWID的 用法

    场景:在书写oracle的sql语句时候,如果语句不存在主键,需要删除几条重复的记录,这个时候如果不知道oracle中的伪列,就需要把所有的重复记录先删除,再插入.这样做好麻烦,可以通过伪列来定位记录 ...

    随机推荐

    Linux 中的数值计算和符号计算

    不知道经常需要做科学计算的朋友们有没有这样的好奇:在 Linux 系统下使用什么工具呢?说到科学计算,首先想到的肯定是 Matlab,如果再说到符号计算,那就非 Mathematica 不可了.可惜, ...

    CSharpGL(4)设计和使用Camera

    CSharpGL(4)设计和使用Camera +BIT祝威+悄悄在此留下版了个权的信息说: 主要内容 描述在OpenGL中Camera的概念和用处. 设计一个Camera以及操控Camera的Sate ...

    BF算法与KMP算法

    BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的 ...

    Eclipse JSP/Servlet 环境搭建

    Eclipse JSP/Servlet 环境搭建 本文假定你已安装了 JDK 环境,如未安装,可参阅 Java 开发环境配置. 我们可以使用 Eclipse 来搭建 JSP 开发环境,首先我们分别下载 ...

    Node安装与环境配置

    1.nodejs(npm)安装 下载nodejs(http://nodejs.cn/)安装后,cmd下如输入 node -v  与  npm -v 出现下图版本提示就是完成了NodeJS的安装 2.n ...

    jmeter监控服务资源

    转:http://www.cnblogs.com/chengtch/p/6079262.html  1.下载需要的jmeter插件 如图上面两个是jmeter插件,可以再下面的链接中下载: https ...

    Linux显示所有运行中的进程

    Linux显示所有运行中的进程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps aux | less USER PID %CPU %MEM VSZ RSS ...

    Python将html转化为pdf

    前言 前面我们对博客园的文章进行了爬取,结果比较令人满意,可以一下子下载某个博主的所有文章了.但是,我们获取的只有文章中的文本内容,并且是没有排版的,看起来也比较费劲... 咋么办的?一个比较好的方法 ...

    Linux Centos7.x 安装部署Mysql5.7几种方式的操作手册

    简述 Linux  Centos7.x 操作系统版本下针对Mysql的安装和使用多少跟之前的Centos6之前版本有所不同的,下面介绍下在centos7.x环境里安装mysql5.7的几种方法: 一. ...

    http协议和telnet指令讲解

    http协议: 1.http:是网络传输协议:全称为:超文本传输协议: 关系:客户端和服务器的关系: 协议:就是一种规范: 常见的http和https两种,https是http的升级版 http协议: ...

    展开全文
  • rowidoracle中的一个重要的概念。用于定位数据库中一条记录的一个相对唯一的地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。rowid它是一个伪列,它并不实际存在于表中。它是oracle在读取表中...

    rowid介绍

    rowidoracle中的一个重要的概念。用于定位数据库中一条记录的一个相对唯一的地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。rowid它是一个伪列,它并不实际存在于表中。它是oracle在读取表中数据行时,根据每一行数据的物理地址信息编码而成的一个伪列。所以根据一行数据的rowid能找到一行数据的物理地址信息,从而快速地定位到数据行。数据库的大多数操作都是通过rowid来完成的,而且使用rowid来进行单行记录定位速度是最快的。

    • 有时繁杂的数据检索时,普通检索条件不能达到要求,可以利用rowid来精确检索结果。

    oracle中如果要查询某张表中的多个字段,又只对某个字段去重的时候用distinct关键字或者group by都不行,【distinctgroup by会对要查询的字段一起进行去重,也就是当查询的所有字段都相同,oracle才会认为是重复的】,这时可以使用rowid

    重复记录的查找

    题目场景:当我们表里面出现了许多的重复记录时,我们需要将重复的记录找出来。
    实现步骤:

    1. 按照重复内容分组
    2. 取出每一组的一条记录并且保留【注意具有唯一性】
    3. 删除未在保留范围的数据

    准备数据:test表

    --创建test表
    create table test(
           name varchar(20),
           age number(3),
           sex varchar(10),
           weight number(3)
    )
    

    上面定义了4个字段,分别是姓名,年龄,性别,体重。接下来往里面添加数据。

    --添加数据
    insert into test values('貂蝉',22,'女',96);
    insert into test values('小乔',24,'女',95);
    insert into test values('孙尚香',21,'女',92);
    insert into test values('露娜',20,'女',94);
    insert into test values('女娲',26,'女',97);
    insert into test values('甄姬',23,'女',91);
    insert into test values('安琪拉',22,'女',98);
    insert into test values('貂蝉',22,'女',96);
    insert into test values('小乔',24,'女',95);
    insert into test values('孙尚香',21,'女',92);
    insert into test values('露娜',20,'女',94);
    insert into test values('女娲',26,'女',97);
    insert into test values('甄姬',23,'女',91);
    insert into test values('安琪拉',22,'女',98);
    

    这里故意添加一些重复的数据,接下来要用到这些,现在看一下表中的内容:
    在这里插入图片描述
    可以看到表中重复数据的内容也一模一样,来查看一下rowid

    --查看rowid
    select name,age,sex,weight,rowid from test order by age desc;
    

    这里为了方便比较相同内容的rowid是不是一样,使用了排序。
    在这里插入图片描述
    可以看到尽管内容都一样,但是rowid不一样。
    现在来完成一个操作:将所有相同的记录只保留一份

    1. 将数据进行分组,按照重复信息分组
    2. 在每一组里面选取一条记录进行保存,取出特性:rowid
    3. 删除时,找那些不在保留范围内的数据,将不再范围的数据删除。
    --将数据进行分组,按照重复信息分组
    select name,sex,age,weight from test group by name,sex,age,weight;
    

    将数据分组,这里将所有信息都查出来:
    在这里插入图片描述
    一共有7组数据,现在要每组数据取一条数据出来,因为其他的字段内容都相同,这里只能取rowid

    --找到每组最小的rowid,也可以取最大的
    select min(rowid) from test group by name,sex,age,weight;
    

    这里每组都取了一个rowid,如下图所示:
    在这里插入图片描述
    接下来只需要把不在这里的rowid的行删除即可,先把不在里面的rowid的行找出来:

    --找到要删除的数据
    select * from test where rowid not in (select min(rowid) from test group by name,sex,age,weight);
    

    这里以刚才的结果集为查询目标,用not in函数找到要删除的rowid
    在这里插入图片描述
    这里没有显示rowid,所有看不到,接下来只需要把这些数据删除即可:

    delete from test where rowid not in (select min(rowid) from test group by name,sex,age,weight);
    commit

    执行完删除之后提交一下事务,接着来查询表中所有数据看看:
    在这里插入图片描述
    可以看到重复的数据都只有一条了,这就是rowid去除重复记录的用法。

    展开全文
  • 如题,初探oracle删除重复记录,只保留rowid最小的记录(rowid可以反映数据插入到数据库中的顺序) 一、删除重复记录可以使用多种方法,如下只是介绍了两种方法(exist和in两种)。 1.首先创建一个测试表。 create...

    如题,初探oracle删除重复记录,只保留rowid最小的记录(rowid可以反映数据插入到数据库中的顺序)

    一、删除重复记录可以使用多种方法,如下只是介绍了两种方法(exist和in两种)。

    1.首先创建一个测试表。

    create table my_users(
        id number,
        username varchar2(20),
        sal number
    )

    2.插入测试数据

    复制代码

    begin
        for i in  1..10 loop
            insert into  my_users values(i,'carl_zhang',i+10);
        end loop;
    end;
    
    begin
        for i in  1..10 loop
            insert into  my_users values(i,'carl_zhang',i+20);
        end loop;
    end;
    
    insert into my_users values(100,'carl',20.3);
    
    commit;

    复制代码

    3.查看重复记录

    复制代码

    select rowid,rownum,a.* from my_users a
    where 1=1
    and exists(
        select 'exist' from my_users b
        where 1=1
        and a.id=b.id
        and a.username=b.username
        having count(*)>1    
    )
    order by rowid

    复制代码

    4.查看重复数据中,rowid最大的记录(rowid可以反映数据插入到数据库中的顺序)

    复制代码

    select rowid,rownum,a.* from my_users a
    where 1=1
    and exists(
        select 'exist' from my_users b
        where 1=1
        and a.id=b.id
        and a.username=b.username
       -- having count(*)>1
        having count(*)>1 and a.rowid=max(b.rowid)
    )
    order by rowid

    复制代码

    5.删除重复数据,保留rowid最小的记录

    复制代码

    delete  from my_users a
    where 1=1
    and exists(
        select 'exist' from my_users b
        where 1=1
        and a.id=b.id
        and a.username=b.username
       -- having count(*)>1
        having count(*)>1 and a.rowid=max(b.rowid)
    )

    复制代码

    二、以上方法是通过exist实现,相比in、not in更加的快速。

    1.如下,查看重复记录。

    复制代码

    select rowid,rownum,a.* from my_users a
    where 1=1
    and (a.id,a.username) in(
        select b.id,b.username from my_users b
        where 1=1  
        having count(*)>1
        group by  b.id,b.username    
    )
    order by rowid

    复制代码

    2.查看重复数据中,rowid最大的记录

    复制代码

    select rowid,rownum,a.* from my_users a
    where 1=1
    and (a.id,a.username,rowid) in(
        select b.id,b.username,max(rowid) from my_users b
        where 1=1  
        having count(*)>1
        group by  b.id,b.username    
    )
    order by rowid

    复制代码

    3.删除重复数据,保留rowid最小的记录

    复制代码

    delete from my_users a
    where 1=1
    and (a.id,a.username,rowid) in(
        select b.id,b.username,max(rowid) from my_users b
        where 1=1  
        having count(*)>1
        group by  b.id,b.username    
    )

    转自:https://www.cnblogs.com/jinhuazhe2013/p/4356809.html

    展开全文
  •  这要删除 id 重复的行,只保留最小的 sql 语句就是: delete from table_name t1 where rowid not in(  select min(rowid) from table_name t2 where t2.id is not null  having count(id) >1 group .....

    举个例子:

        这要删除 id 重复的行,只保留最小的 sql 语句就是:

    delete from table_name t1 where rowid not in(
           select min(rowid) from table_name t2
           where t2.id is not null
           having count(id) >1 group by t2.id
    )

    或者是这样子: 

    delete from table_name t1 where rowid >(
           select min(t2.rowid) from table_name  t2
           where t1.id=t2.id
           )

     二者选一拿去用吧.

    大致逻辑就是:

    子查询筛选出  最小 ,没有重复的 rowid

    跟原表比较,删除重复的

    展开全文
  • oracle 使用rowid删除重复数据

    千次阅读 2018-06-04 20:04:35
    经常有这样一个业务场景,我们在同一张表中有重复的记录,我们要删除重复的记录,这篇文章就是用来解决这个问题的,用的方法是我目前遇到的效率最高的方法(如果有更好的方法欢迎网友提供)。这个方法会用到了rowid...
  • Type ----------------------------------------- ROW_ID ROWID OWNER VARCHAR2(30) TABLE_NAME VARCHAR2(30) CONSTRAINT VARCHAR2(30) SQL>alter table cz add constraint cz_unique unique(c1,c10,c20) ...
  • Oraclerowid删除重复记录查询:select * from org_dept a where a.rowid != (select max(rowid) from org_dept b where a.dept_code = b.dept_code) 删除:delete from org_dept a where a.rowid != (se
  • /**如何删除重复记录?*//*1. 先按重复字段分组 2. 在每组里找出最小的rowid 3. 把整个表中与上面查询出来的rowid不相等的记录删除掉*/delete from test_tbl2where rowid not in (select min(rowid) from test_tbl2 ...
  • 文章目录1 删除语句2 基础数据 1 删除语句 delete from scott.stu_info a where a.rowid > (select min(b.rowid) from scott.stu_info b where b.sno = a.sno); 2 基础数据 create table scott.stu_info ...
  • 巧用rowid删除重复记录第一:当重复的记录只有1条时:在oracle中,每一条记录都有一个rowidrowid在整个数据库中是唯一的,rowid确定了每条记录是oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有...
  • 今天工作时,发现系统流水帐重单,主不重,子重,因子表中没有主键,删除重单比较困难,考虑到用rowid删除,在网上发现下面这篇文章,觉得很不错,特引用如下: 平时工作中可能会遇到当试图对库表中的某一列或...
  • Oracle利用rowid删除表中重复记录

    千次阅读 2016-03-13 10:01:46
    Oracle利用rowid删除表中重复记录   先看表myemp   查出有重复数据的记录   查出没有重复数据的记录   查出不重复的记录   或者 select * ...
  • Oracle rownum、rowid 详解

    2020-12-08 23:39:18
    (1) 相同点:都是 '伪列' -- Oracle 自动加上去的,无法人为操作 (2) 不同点:rowid 记录的物理地址,相对不变, rownum 记录的编号,会变化,尤其是使用 order by 的时候 2. rownum:某条记录的编号 -- row ...
  • 1.Oracle删除重复记录.删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录.delete from peoplewhere peopleId in (select peopleId from people group by peopleId having ...
  • 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断select*from表...1)2、删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录DELETEfrom表WHERE(id)IN(SELECTidF...
  • ORACLE中的rowid用法

    千次阅读 2019-10-06 02:25:40
    rowid概述 rowid是一个用来唯一标记表中行的伪列。它是物理表中行数据的内部地址,包含两个地址,其一为指向数据表中包含该行的块所存放数据文件的地址,另一个是...从Oracle 8i开始使用扩展rowid标识行物理地址 ...
  • 1、rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行。 2、rowid是存储在索引中的一组既定的值(当行确定后)。我们可以像表中普通的列一样将它选出来。 3、利用rowid是...
  • -- 1 通过ROWID删除T1表里重复的记录 SELECTROWID,A,B--DELETEFROMT1WHEREROWIDIN(SELECTRDFROM(SELECTA,B,ROWIDRD,ROW_NUMBER()OVER(PARTITIONBYA,BORDERBYROWID)RNFROMT1)T2...
  • oracle去除重复数据

    2021-04-12 20:36:46
    1、删除所有重复的行 delete from dis_zj_dz_back t where t.rowid in (select rid from (select t1.rowid rid, count(1) over(partition by t1.JOB_FLOW) rn from dis_zj_dz_back t1) t2
  • Oracle查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 where IOracle查询及删除重复记录的SQL语句1、查找表中多余的重复记录,重复记录是根据单个字段...
  • Oracle中用Rowid查找和删除重复记录 平时工作中可能会碰到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录。 下面总结一下几种查找和删除重复记录的方法(以表CZ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,718
精华内容 6,287
关键字:

oracle删除重复rowid