如何找到该表中重复的数据?
如何找到该表中重复的数据?
现有表如下:
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