一个经典的问题:如何从表中找到并去掉重复的数据? 解决这个问题的方式真的有很多,让我们来举出几种吧。
举例:删除id和那么都重复的数据
SQL> select * from b;
ID NAME
---------- ----------
1 aa
2 bb
3 cc
4 dd
1 aa
2 bb
3 cc
4 dd
8 rows selected.
1.用distinct查询来重建表
SQL> create table b_bak as select distinct id,name from b;
Table created.
SQL> rename b to b1;
Table renamed.
SQL> rename b_bak to b;
Table renamed.
SQL> select * from b;
ID NAME
---------- ----------
1 aa
2 bb
4 dd
3 cc
这种方式对于大表来说要消耗多余的空间,而且线上系统可能会造成数据的丢失。
使用group by来去重和这种方式类似,逻辑读少些,但是根本问题无法解决。
2.使用约束和exceptions表去重
思路:通过创建约束和异常记录保存表来得到不满足约束(重复)的数据
SQL> alter table b add constraint pk_b primary key(id,name) deferrable enable novalidate;
SQL> alter table b enable validate constraint pk_b;
alter table b enable validate constraint pk_b
*
ERROR at line 1:
ORA-02437: cannot validate (SCOTT.PK_B) - primary key vio