zoukankan      html  css  js  c++  java
  • Oracle查询某几个字段重复的记录,并删除重复记录,只保留不重复的记录

    有某个数据表,由于数据表在设计阶段没有建立主键约束,跑了一段时间业务后导致有很多重复的记录,如何查询出重复的记录,并将重复的部分删除,保证某几个字段组合的唯一性。

    只有将重复的记录删除,才能重写建立主键约束。

     

     

     如上图:业务表中有TEMPLATE_NAME重复的记录,假设数据表中有很多数据,手动删除比较费时费力,需要用脚本删除。

    最终效果为:重复的记录随便删除一条,保证TEMPLATE_NAME字段的唯一性。如下图:

     

     

     

    --1.COUNT子查询,查询结果(记录a+与a重复的记录)
    SELECT * FROM MY_TABLE A WHERE (SELECT COUNT(*) FROM MY_TABLE B WHERE A.TEMPLATE_NAME=B.TEMPLATE_NAME)>1 ORDER BY A.TEMPLATE_NAME
    
    --2.INNER JOIN+ROWID过滤,查询结果(记录a+与a重复的记录)
    SELECT A.ROWID,B.ROWID, A.* FROM MY_TABLE A INNER JOIN MY_TABLE B ON A.TEMPLATE_NAME=B.TEMPLATE_NAME AND A.ROWID!=B.ROWID  ORDER BY A.TEMPLATE_NAME
    
    --3.GROUP+HAVING过滤,查询结果(记录a+与a重复的记录)
    SELECT * FROM MY_TABLE A WHERE A.TEMPLATE_NAME IN (
      SELECT B.TEMPLATE_NAME FROM MY_TABLE B GROUP BY B.TEMPLATE_NAME HAVING COUNT(B.TEMPLATE_NAME) > 1
    ) ORDER BY A.TEMPLATE_NAME
    
    --4.OVER+PARTITION BY过滤,查询结果(仅查询与a重复的记录)
    SELECT * FROM 
    (
    SELECT A.TEMPLATE_NAME, ROWID,ROW_NUMBER() OVER (PARTITION BY A.TEMPLATE_NAME ORDER BY A.TEMPLATE_NAME) Rc FROM MY_TABLE A
    ) WHERE Rc>1
    ORDER BY TEMPLATE_NAME
    
    --5.HAVING+MIN ,查询结果(仅查询与a重复的记录)
    SELECT * FROM  MY_TABLE WHERE (TEMPLATE_NAME) IN ( 
    SELECT TEMPLATE_NAME FROM MY_TABLE GROUP BY TEMPLATE_NAME HAVING COUNT(id) > 1) AND ROWID NOT IN (SELECT MIN(ROWID) FROM TEMPLATE_NAME GROUP BY TEMPLATE_NAME HAVING COUNT(*) > 1);
    
    --6.删除重复记录,只保留一条未重复
    DELETE FROM MY_TABLE
    WHERE ROWID IN
    (
    SELECT ROWID FROM 
    (SELECT A.TEMPLATE_NAME, ROWID,ROW_NUMBER() OVER (PARTITION BY A.TEMPLATE_NAME ORDER BY A.TEMPLATE_NAME) Rc FROM MY_TABLE A)
    WHERE Rc>1 
    )
     
    --7.删除重复记录,只保留一条未重复
    DELETE MY_TABLE WHERE (TEMPLATE_NAME) IN ( 
    SELECT TEMPLATE_NAME FROM MY_TABLE GROUP BY TEMPLATE_NAME HAVING COUNT(id) > 1) AND ROWID NOT IN (SELECT MIN(ROWID) FROM TEMPLATE_NAME GROUP BY TEMPLATE_NAME HAVING COUNT(*) > 1);
     
    

      

  • 相关阅读:
    POWERDESIGNER中显示样式设置
    DatagridView 最后编辑状态数据无法自动提交的问题
    oracle 10G以上版本 树形查询新加的几个功能
    net farmework 4安装不了 原因是 HRESULT 0xc8000222
    npoi 导出
    oracle rowtype
    fiddler https
    一次linux站点安装经验
    小米手机安装https证书报错:无法安装该证书 因为无法读取该证书文件
    日志系统
  • 原文地址:https://www.cnblogs.com/soulsjie/p/15219476.html
Copyright © 2011-2022 走看看