日期:2014-05-17  浏览次数:20907 次

如何找到该表中重复的数据?

如何找到该表中重复的数据?
现有表如下:
CREATE   TABLE   test
(
v1   integer   NOT   NULL,
v2   INTEGER   NOT   NULL,
)
表中有如下数据:
v1   v2
1   9
1   8
1   3
1   9

现在需要把这个表里的第一行和第四行通过一个select找出来,因为这两行都一样
这个select怎么写?



------解决方案--------------------
1、Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,
  rowid确定了每条记录是在ORACLE中的哪一个数据文件、块、行上。

2、在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中
  那些具有最大rowid的就可以了,其余全部删除。

3、以下语句用到了3项技巧:rowid、子查询、别名。

实现方法:
SQL> create table a (
2 bm char(4), --编码
3 mc varchar2(20) --名称
4 )
5 /

表已建立.

SQL> insert into a values( '1111 ', '1111 ');
SQL> insert into a values( '1112 ', '1111 ');
SQL> insert into a values( '1113 ', '1111 ');
SQL> insert into a values( '1114 ', '1111 ');

SQL> insert into a select * from a;

插入4个记录.

SQL> commit;

完全提交.

SQL> select rowid,bm,mc from a;

ROWID BM MC
------------------ ---- -------
000000D5.0000.0002 1111 1111
000000D5.0001.0002 1112 1111
000000D5.0002.0002 1113 1111
000000D5.0003.0002 1114 1111
000000D5.0004.0002 1111 1111
000000D5.0005.0002 1112 1111
000000D5.0006.0002 1113 1111
000000D5.0007.0002 1114 1111

查询到8记录.

查出重复记录
SQL> select rowid,bm,mc from a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

ROWID BM MC
------------------ ---- --------------------
000000D5.0000.0002 1111 1111
000000D5.0001.0002 1112 1111
000000D5.0002.0002 1113 1111
000000D5.0003.0002 1114 1111

删除重复记录
SQL> delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

删除4个记录.

SQL> select rowid,bm,mc from a;

ROWID BM MC
------------------ ---- --------------------
000000D5.0004.0002 1111 1111
000000D5.0005.0002 1112 1111
000000D5.0006.0002 1113 1111
000000D5.0007.0002 1114 1111


------解决方案--------------------
select a.* from test a,
(select v2, count(v2)
from test
group by v2
having count(v2) > 1
) b
where a.v2 = b.v2
------解决方案--------------------
select v1,v2 from test group by v1,v2 having count(*)> 1
接分!
------解决方案--------------------
写个另类的给你吧

不用MAX,也不用GROUP BY

CREATE TABLE test(v1 integer ,v2 INTEGER);

INSERT INTO TEST
SELECT 1, 9 FROM DUAL UNION ALL
SELECT 1, 9 FROM DUAL UNION ALL
SELECT 1, 8 FROM DUAL UNION ALL
SELECT 1, 3 FROM DUAL;

SELECT V1,V2
FROM (
SELECT (SUM(ROWNUM) OVER(PARTITION BY V1,V2 ORDER BY V2)/ROWNUM) AS LABEL,
V1,V2
FROM TEST
)
WHERE LABEL > 1