如何找到该表中重复的数据?
现有表如下:
CREATE TABLE test
(
v1 integer NOT NULL,
v2 INTEGER NOT NULL,
)
表中有如下数据:
v1 v2
1 9
1 8
1 3
1 9现在需要把这个表里的第一行和第四行通过一个select找出来,因为这两行都一样
这个select怎么写?

解决方案 »

  1.   

    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 
      

  2.   

    select a.* from test a,
                            (select v2, count(v2) 
                             from test 
                             group by v2 
                             having count(v2) >1
                            ) b
    where a.v2 = b.v2
      

  3.   

    select v1,v2 from test group by v1,v2 having count(*)>1
    接分!
      

  4.   

    写个另类的给你吧不用MAX,也不用GROUP BYCREATE 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
      

  5.   

    常规思维都用MAX或是GROUP BY去了,呵呵
      

  6.   

    TO:DragonBill
    我做的事情可杂了 现在做的比较多的是ORACLE的开发我家在苏州昆山的,这个月底离职,暂时没有找到合适的工作,
      

  7.   

    PS:DragonBill你的分析函数的使用功底不错呀比我强多了
      

  8.   

    昆山,呵呵,我有个朋友也在昆山做事我是做ERP方面的,用MS SQL-_-#哪里哪里,呵呵,水平一般一般:)