Oracle单表去重
去重有两层含义,一是记录彻底同样。而是符合必定条件的认为是重复。
根据表的数量,去重可划分为单表去重和多表关联去重。
对于去重,通常最容易想到的是用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的效率要高,当表数据量很大的时候,差距会很明显。