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的效率要高,當表數據量很大的時候,差距會很明顯。