数据表saledata中的主码应为salID,在创建数据库时未对该表设置主键,结果在应用程序操作中使得该表中出现了很多重复的记录行,怎么编写具体的实现SQL清除数

解决方案 »

  1.   


    DELETE FROM saledata a WHERE ROWID!=(SELECT Max(rowid) FROM saledata WHERE a.salID=salID) ;
      

  2.   

    --参考这个例子
    SQL> select * from test;        ID        NUM
    ---------- ----------
             1          1
             1          1
             2          2
             2          2
    SQL> delete test a where a.rowid!=(select max(rowid) from test b where a.id=b.id and a.num=b.num);已删除2行。
    SQL> commit;提交完成。SQL> select * from test;        ID        NUM
    ---------- ----------
             1          1
             2          2
      

  3.   

    数据表saledata中的主码应为salID
    ----------------------
    delete from saledata
    where rowid in (
      select rowid from (
        select rowid,row_number() over(partition by salID order by rowid) r1
        from saledata
      ) t
      where r1 > 1
    )
      

  4.   

    引用楼主 cplzh0808010119 的回复:
    数据表saledata中的主码应为salID,在创建数据库时未对该表设置主键,结果在应用程序操作中使得该表中出现了很多重复的记录行,怎么编写具体的实现SQL清除数
      

  5.   

    引用楼主 cplzh0808010119 的回复:
    数据表saledata中的主码应为salID,在创建数据库时未对该表设置主键,结果在应用程序操作中使得该表中出现了很多重复的记录行,怎么编写具体的实现SQL清除数
      

  6.   

    2楼正解,把所有重复记录任意取一条出来,记录他们的rowid,然后把不是这些rowid的所有重复数据再删除即可
      

  7.   

    举例:delete from test1 t1 where rowid != (select max(rowid) from test1 t2 where t1.tid = t2.tid);
      

  8.   

    注意两点
    1. 对于出现重复的,选择删除哪一条的依据。
    2. 最好是把需要的记录insert到其他的表,对照完以后再改过来。
      

  9.   

     delete from saledata a 
    where a.rowid>(select min(b.rowid) from saledata b where a.salID=b.salID)
    取第一次插入的数据,不过楼主操作的时候最好先备份一下这个表,这样子弄错了,还可以再次恢复。