orcle not like不建议使用(not like所踩过的坑!)

it2025-04-26  9

1.情景展示

  现在有一张表,需要将表中某字段的值不是以指定字符开头的列进行删除,如何实现? 

2.问题分析

  错误方案一:同事想到的是:这种方式

  咱们来看一下,这个表总共有多少条数据

  本来表数据总共才4万多条数据,然而使用上面的查询方式,却查出了1多个亿的数据,真不知道这数据库是怎么想的。

  错误方案二:既然不行,我首先想到的是:使用not like实现,实践结果如下:

  再来看一下,使用like查询有多少条数据。

  总共的数据为:40059+3972=44031条 数据,比总表数44295要少,也就是说:使用not like查询会遗漏数据,具体什么原因想不通。

3.解决方案

  正确方案一:既然not like不行,我就想到用了使用exists()实现。 

  先来查查符合条件的,使用exists()查询一下与使用like的语句是否一致。

  结果一致,再看一下,使用not exists()的查询结果

  算一下,与总数是否一致:40323+3972=44295,与结果一致,大功告成!

--查询表中不是以0.1.2.开头的数据(使用exists实现) SELECT COUNT(1) FROM BASE_ORG_INFO T WHERE NOT EXISTS (SELECT 1 FROM (SELECT ORGID FROM BASE_ORG_INFO WHERE ORGSEQ LIKE '0.1.2.%') S WHERE S.ORGID = T.ORGID)

  如何删除这些数据?

--删除表中某字段不是以0.1.2.开头的数据(使用IN+EXISTS实现) DELETE FROM BASE_ORG_INFO T2 WHERE T2.ORGID IN (SELECT T.ORGID FROM BASE_ORG_INFO T WHERE NOT EXISTS (SELECT 1 FROM (SELECT ORGID FROM BASE_ORG_INFO WHERE ORGSEQ LIKE '0.1.2.%') S WHERE S.ORGID = T.ORGID))

  执行结果:

  方案二:直接使用not in()就可以搞定的事情,饶了一大圈!!!

DELETE FROM BASE_ORG_INFO T2 WHERE T2.ORGID IN (SELECT T.ORGID FROM BASE_ORG_INFO T WHERE T.ORGID NOT IN (SELECT ORGID FROM BASE_ORG_INFO WHERE ORGSEQ LIKE '0.1.2.%'))

  执行结果如下:

 

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

个人主页oracle主题oracle 如何快速删除两表非关联数据(脏数据)?

 

 

转载于:https://www.cnblogs.com/Marydon20170307/p/11215140.html

相关资源:数据结构—成绩单生成器
最新回复(0)