首页 > 数据库 >oracle删除表中重复的行数据

oracle删除表中重复的行数据

时间:2024-12-27 08:58:39浏览次数:3  
标签:name 删除 表中 b1 rowid SQL oracle id select

#如下测试表b,如何删除重复值字段:

SQL> select * from b1; 

ID NAME

---------- ----------         

1 a         

1 a         

1 b         

2 a

1 a
2 a

 

#小结:重复值多:则重建表更好、 重复值少,表大,则delete更好

 

#方法一:

group by 分组,找到有效数据,创建一个新表,数据插入,随后删除原表,随后rename 该名称:

SQL> create table b2 as select * from b1 group by id,name;

SQL> select * from b2;

  1 a          1 b          2 a

SQL> drop table b1 purge;

SQL> alter table b2 rename to b1;

 

#方法二:

找出不符合规则的数据,delete删除

SQL> select rowid,id,name from b1 where (id,name) in(select id,name from b1 having(count(*))>1 group by id,name);

 

ROWID                      ID NAME
------------------ ---------- ----------
AAAV3EAAEAAAAKTAAA          1 a
AAAV3EAAEAAAAKTAAB          1 a
AAAV3EAAEAAAAKTAAD          2 a
AAAV3EAAEAAAAKWAAE          1 a
AAAV3EAAEAAAAKWAAF          2 a

 

#本想通过rownum,最后还是选择rowid  唯一

#查询符合条件的ROWID:重复行数据中,最小的rowid的value

SQL> select min(rowid) from b1 group by id,name having(count(*))>1;

MIN(ROWID) ------------------

AAAV3EAAEAAAAKTAAA

AAAV3EAAEAAAAKTAAD

 

#删除语法:因为如果表没有任何列是唯一的,那么最好直接使用rowid,稳定唯一:

找到所有重复记录的value, 排除重复记录中,最小的rowid 保留一行

SQL>  delete from b1

where rowid in

(select rowid from b1 where (id,name)

         in(select id,name from b1 having(count(*))>1 group by id,name))

and rowid not in

(select min(rowid) from b1 having(count(*))>1 group by id,name);

 

3 rows deleted.

 

SQL> select * from b1;

        ID NAME ---------- ----------        

  1 a          1 b          2 a

SQL> commit;

标签:name,删除,表中,b1,rowid,SQL,oracle,id,select
From: https://www.cnblogs.com/gdjgs/p/18634516

相关文章

  • Oracle查询用户拥有所有系统权限
    SQL>descdba_sys_privs;查询对象拥有的系统权限NameNull?Type---------------------------------------------------------------------------GRANTEENOTNULLVARCHAR2(30)PRIVILEG......
  • 多数据源配置:使用Dynamic-datasource框架实现数据源切换、动态新增且使用新数据源、查
    前言多数据源的切换具有十分广泛的应用场景,同时可以简化主从复制、读写分离等方案的实现过程,通过继承AbstractRoutingDataSource并重写相关方法,结合拦截器、AOP以及自定义注解即可实现,但过程比较繁琐。因此可以利用Dynamic-datasource框架轻松实现数据源切换,并且通过框架预留......
  • 服务器密码被篡改且数据库被删除,如何提高服务器安全性?
    针对您提到的服务器密码被篡改及数据库被删除的问题,建议采取以下措施来提高服务器的安全性:检查弱密码:确认所有账户使用强密码策略,避免使用简单易猜的密码。定期更新软件:确保服务器操作系统和应用程序保持最新版本,及时安装安全补丁。限制远程访问:只允许必要的IP地......
  • python脚本定期删除EFK日志索引
    使用pyhon脚本删除50天前的日志!/usr/bin/python3fromelasticsearchimportElasticsearchfromdatetimeimportdatetime,timedeltaElasticsearch服务器地址,默认本地为'localhost',可按需替换es_host="localhost"Elasticsearch服务器端口,默认9200,按需替换es_port=92......
  • 【8.5】链表-删除排序链表中的重复元素
    一、题目        给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回已排序的链表 。示例1:输入:head=[1,1,2]输出:[1,2]示例2:输入:head=[1,1,2,3,3]输出:[1,2,3]提示:链表中节点数目在范围[0,300]内-100<=No......
  • Java项目中Oracle数据库开发过程中相关内容
    目录1、连接数据库2、创建用户和授权3、统计的时候——把列变成行4、Oracle12c数据库中,根据时间倒序返回最新一条数据5、其他SQL相关记录总结一些和Oracle相关的内容1、连接数据库使用oracle12c数据库自带的SQLPlus链接数据库打开SQLPlus工具,输入:sqlplus/nolo......
  • CSharp: Oracle Stored Procedure query table
    oraclesqlscript:CREATEORREPLACEPROCEDUREprocSelectSchool(paramSchoolIdINchar,p_cursorOUTSYS_REFCURSOR)ASBEGINOPENp_cursorFORSELECT*FROMSchoolWHERESchoolId=paramSchoolId;ENDprocSelectSchool;......
  • Linux红旗系统下修改oracle11实例名
    原数据库实例名称为:orcl 修改为 project1.查询当前设置的实例名切换到Oracle用户下su-oracle(1)查询配置的实例名称echo${ORACLE_SID}(2)查询数据库中的实例名称sqlplus/nologsql>conn/assysdbasql>selectinstancefromv$thread;2.关闭数据服务(1)关......
  • Oracle/达梦8 导出导入exp/imp
    前提导出、导入语句只能在安装了oracle或者达梦的客户端的机器执行。或者有依赖的机器执行Oracle11不使用数据泵,就使用普通的导入导出参考:https://blog.csdn.net/hurtseverywhere/article/details/139504069?fromshare=blogdetail&sharetype=blogdetail&sharerId=13950406......
  • Centos 7.4 配置RAC+ASM( oracle19c)
    Centos7.4配置RAC+ASM(oracle19c)一、安装准备1环境规划:类型配置操作系统vmare+Centos7.4两台磁盘50G内存4G网络建议绑定双网卡数据库版本oracle19c共享存储ASM需配置两个网卡,一块共享磁盘。说明:当前为测试环境,生产环境建议参考官方建......