当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
综合辅导:Oracle单表去重
发布时间:2010/9/7 17:22:24 来源:www.xue.net 编辑:城市总裁吧

  根据表的数量,去重可划分为单表去重和多表关联去重。

  对于去重,一般最容易想到的是用distinct,而distinct只能对完全重复的记录保留一条。distinct使用的是二重循环来去重的,如果数据量非常大的时候,会导致性能急剧下降。

  下面是一个单表去重的测试,认为name字段相同的即为重复记录,要查询出一个结果,过滤掉重复,distinct显然不能满足要求。

  表SQL:

  create table A_TEST

  (

  id     number,

  name   varchar2(20),

  remark varchar2(20)

  );

  insert into A_TEST (ID, NAME, REMARK)

  values (1, 'a', 'ss');

  insert into A_TEST (ID, NAME, REMARK)

  values (2, 'b', 'xxx');

  insert into A_TEST (ID, NAME, REMARK)

  values (3, 'b', 'x');

  insert into A_TEST (ID, NAME, REMARK)

  values (4, 'b', 'asd');

  insert into A_TEST (ID, NAME, REMARK)

  values (5, 'c', 'axxx');

  insert into A_TEST (ID, NAME, REMARK)

  values (6, 'c', 'asdf');

  去重方式一(低效):

  select a.*

  from A_TEST a, (select min(id) as id from A_TEST t group by name) b

  where a.id = b.id;

  去重方式一(高效):

  select *

  from (select a.*, rownum row_num from A_TEST a) x

  where x.row_num in (select min(rownum) from A_TEST t group by name)

  可见,使用rownum的效率比使用id的效率要高,当表数据量很大的时候,差距会很明显。

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved