问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Oracle中用rowid删除重复行

发布网友 发布时间:2022-04-09 05:38

我来回答

2个回答

懂视网 时间:2022-04-09 09:59

1、ROWID定义

ROWID:数据库中行的全局唯一地址

对于数据中的每一行,rowid伪列返回行的地址。rowid值主要包含以下信息:

  • 对象的数据对象编号
  • 该行所在的数据文件中的数据块
  • 该行中数据块的位置(第一行是0)
  • 数据行所在的数据文件(第一个文件是1)。该文件编号是相对于表空间。
  • 通常来说,一个rowid值唯一标识数据中的一行。然而,存储在同一聚簇中不同的表可以有相同的rowid。

    2、实现的方法

    方法一:

    DELETE FROM hr.employees
    WHERE ROWID IN (
       SELECT ROWID
       FROM (
       SELECT first_name,
        last_name,
        ROWID,
        ROW_NUMBER() OVER(PARTITION BY first_name,last_name ORDER BY employee_id) AS staff_row --按照保留的唯一字段进行分区,取row_number
        FROM hr.employees
       )
       WHERE staff_row > 1
      );

     

      乍一看,我勒个去,这个是什么东西要,这么难懂!!没关系,下面给您解释一下,就很好懂了。

      针对的是oracle内置的示例用户hr中的employees这张表,我们希望的是first_name和last_name没有重复的项(如果你的业务需要时别的话可以相应的转换,如在成绩表中的学号就是唯一个,就partition by学号),所以对这两个字段进行partition  by。

      在子查询的子查询中我们选择的主要目的是rowid和row_number(first_name和last_name只是用来辅助理解加进去的字段);子查询中我们选择了row_number > 1的rowid,这样的话按照first_name和last_name分组中每一个分组只有一条记录没有被选择;最外面的delete就直接把选择出来的rowid进行了删除。至此完成了hr.employees对于first_name和last_name的去重。

      有朋友会说,妈蛋这太难理解了吧!在这种情况下,往往有方法二~~~

    方法二:

    DELETE FROM hr.employees t1
    WHERE t1.ROWID NOT IN (
       SELECT MIN(t2.ROWID)
       FROM hr.employees t2
       GROUP BY t2.employee_id --按照想要唯一保留的字段进行分组
       );

      这个明显就比方法一好多了,子查询中我们先选除了rowid,然后按照我们想要保留的唯一字段进行分组,并取每组最小的rowid(注意是子查询表的rowid);然后在用not in删除除开最小的rowid以外的所有记录。

      怎么样,这个方法是不是瞬间解决并且非常好理解?但是你以为这样就结束了?no no no

    方法三:

    DELETE FROM hr.employees t1
    WHERE t1.rowid > (
       SELECT MIN(t2.rowid)
       FROM hr.employees t2
       WHERE t1.employee_id = t2.employee_id --按照想要唯一保留的字段进行匹配
       );

      这个方式看起来和方法二差不多,但是想要说的是,他用的是连接,他用的是连接,不敢说连接一定比group by快,但是基本上不会输group by,而且在一般的情况下也是最快的了。而且外层的">"可以用到索引,就是各种快。

      方法也同样说一下,子查询中按照要保留的字段对t1和t2进行关联,然后选择出最小的rowid(注意是子查询表的rowid),然后在外层用">"只保留每个匹配结果最小的一条记录。然后就瞬间删除重复的记录

     

      此时有朋友以为这是最快的办法了,但是,我想说,不是,不是!请看下面最快的方法!

    技术分享
    --骗一下你的,上面已经是本人接触到的最快的方法了
    View Code

     

    Oracle用rowid删除同一张表的重复记录

    标签:

    热心网友 时间:2022-04-09 07:07

    根据rowid删除myemp 表中历史数据(也就是说,rowid最大的记录是不删除的,其余删除)追问max,改成min行吗?反正都是删除一个

    追答如果改成min就是保留rowid最小的,其余的删除,根据你自己的需要选择即可。

    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    怀孕错过了糖筛怎么办 糖筛有哪些注意事项 怀孕几个月查唐筛 蔡家沟镇慈云寺 哈佳高铁高楞站多少平方米位置在那 超威电池生产日期怎么看 超威电池寿命一般多长时间 华晨宇鸟巢四面台10w+秒罄!!火星演唱会舞台概念图震撼发布! 手机连接160wifi电脑蓝屏使用160WiFi遇到问题应该如何解决 为什么手机wifi总是刚开启,锁屏就掉了。wifi设置里的休眠模式也是永久的... 建行卡为什么不能网上转账 学校发我们的建设银行卡一定要激活吗? 我打电话查余额说输入取钱密码... 小米手机用oppo充电器会影响oppo手机充电速度吗 你好,我的opporeno7pro充电线配其他充电头给小米手机充电会对充电线有影响吗? 小米手机能用oppo手机快充吗 oracle用rowid去掉重复值 石斛的功能有哪些 元宵节下去是什么节 下次元宵节 清下水道的化学方法,就是厨房下水道油污太大堵塞不流通了,用什么化学方法通 中国每年几十亿人乘坐的高铁,半年亏了955亿,为何还一直修建? 2017年中国铁路投资额有多少? 中国铁路年客流量是多少? 2015年铁路统计公报 中国高铁总里程已占世界总量的66.3%了吗? 喝中药期间可以喝南瓜花生粥吗 黑木耳、花生、南瓜和大米、小米煮的粥有什么营养价值? 颈椎生理曲线的颈椎曲度 南瓜红枣花生小米粥有什么功效 什么是颈椎的生理曲度 颈椎的前凸生理曲度是怎么回事? 颈椎弯曲是什么? 菲力尔flir红外热像仪多少钱? 买入固定资产40000转卖了50000.不考虑增值税怎么做分录? 穷人买入负债富人买入资产是什么意思? 新公司低价买入的资产怎么做账? 购买资产如何做分录 书上说买入外币资产,则外币资产供给减少,本国货币供给增加,怎样理解?求详细解释,分数可以全部给你 请教问题,买入的固定资产是以转让赚取差价为目的,即买入后,先入账,然后再转手卖出,请问买入后该如何 当股票下滑时买入的资产会减少吗 买入的固定资产 税和各项费用计入吗 为什么中央银行买入国内资产会导致外汇储备流失 1000万元买入固定资产,计提折旧200万元,1200万元卖出,会计分录如何做;900万元卖出又如何做? 一万元能购买什么资产? 购买固定资产的账务处理? 梦见一位老人被打死 梦见自己杀死了一个现实中已死的老人 梦到把认识的已故长辈杀了是什么意思? 电脑内存8G(3.96G可用)? 2011年广州哪里有元宵灯会?哪里好玩点?票价多少? 2011年元宵节广州哪里有花灯看? 今天元宵节,广州那些地方有灯会看啊