一、场景描述
查询机构下的人员,要同时查询出该机构及其所有下级机构的人员;比如查询北京市,不仅要查询出归属于北京市的人员,还要查询归属于出朝阳区、西城区、海淀区等等的人员。
对于这个需求,有以下几种解决思路:
1、之前的系统,他们的机构编码本身有关联,比如北京编码是001的话,昌平区的编码就是0012;这样的话,他们查询可以用like。这种方法的问题是like查询太慢,尤其在数据量大的时候,即使对编码加唯一索引,也只有查最根部机构时可以走索引(因为只有此时才符合最左前缀)。
2、我们的系统没有机构编码,唯一标识是雪花算法生成的19位id,没有关联;机构关系是通过一张关联表组合的起来的(适用于多业务系统,多机构树的情况)。这种情况,可以通过条件从关系表中查出所有下级机构id,然后查询时用in查询;为了方便查询,我们还建了一张机构关系冗余表。
但是这种方法也有一个问题,就是Oracle数据库in查询中元素,必须在1000以内。

二、解决方案
1、方案一:核心思路是,将集合拆分,使用or 连接。
select * from A where id in (1, 2, …, 1000) or id in (1001, …, 1999)

用mybatis的话就是这样

select * from test_1
<where><if test="list != null and list.size > 0">(id IN<!-- 处理in的集合超过1000条时Oracle不支持的情况 --><trim suffixOverrides=" OR id IN()"><foreach collection="list " item="Id" index="index" open="(" close=")"><if test="index != 0"><choose><when test="index % 1000 == 999">) OR id IN (</when><otherwise>,</otherwise></choose></if>#{Id}</foreach></trim>)</if>

但是这种方法不好用,实测中3万条左右的机构,用这种查询查了好久都没出来,感觉数据库都要奔溃了。

2、方案二:用子查询(临时表)+关联查询
一般来说,超过1000多条的数据,肯定不是用户填写的,而是从其他地方查询出来的;我们可以将这些数据放到一个临时表中(用子查询实现),然后用内连接关联查询。

该查询中,机构关系冗余表SEP_SYSTEM_ORG_RELATION中有20多万条数据,但子查询走了我们创建的组合索引;整个查询只用了0.367秒

sql-in查询-元素超过1000条解决方案相关推荐

  1. sql查询in条件超过1000条解决方案

    一. 背景: 小熙最近做的数据检索比较大,其中会使用到,in的条件会有超过1000条.但是in所支持的条件数量最多只有1000,那怎么办呢,后来小熙采取了分区检索,完成了. 二. 引入依赖: 引入ap ...

  2. Oracle数据库查询用 where in 查询的项超过1000条的解决方案

    众所周知,如果我们的用SQL查询语句时,如果用where in带的参数超过1000条的话,oracle是会报错的. 因为项目中遇到这样的问题,所以找到了接下来我要说的这个办法. 因为用的地方很多,所以 ...

  3. Oracle1401和1438,Oracle SQL in 超过1000的解决方案

    起因: 代码程序由于设计问题,采用了效率不太高的oracle 的in语句,当条件超过1000之后oracle会抛出ora-01795: 经过: 1,oracle中如果非要用in作为条件的话,超过100 ...

  4. 处理 Oracle SQL in 超过1000 的解决方案

    处理oracle sql 语句in子句中(where id in (1, 2, ..., 1000, 1001)),如果子句中超过1000项就会报错. 这主要是oracle考虑性能问题做的限制.如果要 ...

  5. oracle的in的值超过3000,处理 Oracle SQL in 超过1000 的解决方案

    http://www.cnblogs.com/hoojo/archive/2012/08/31/2665396.html hoojo的这篇博文里面,介绍了处理Oracle SQL in超过1000的解 ...

  6. 板卡上的日志缓冲区只可以记录1000条日志,当超过1000条记录时,新增的日志将覆盖旧的记录(是最旧的记录)

    王晓华前辈在"一个队列引发的惨案"一节中,说到用循环队列处理固定长度缓冲区问题,小僧读到这里,深深一惊,不禁感叹算法与数据结构结合的巧妙!!!也许是因为小僧是菜鸟,也许是因为小僧少 ...

  7. sql 分组查询 数据 大于2条的数据

    select COUNT(Email) ,Email from tb_Mer_Accounts Group by Email having COUNT(Email)>1

  8. 面试高频,一条sql语句查询成绩,显示'优秀' ,'及格' ,'不及格'

    有一张表,里面有3个字段:语文,数学,英语.其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来: 按照要求查询后显示 话不多说 , 直接上 ...

  9. mysql只能导出65535条_导出Excel超过65535条限制解决方案

    使用poi导出excel的时候如果数据过多,超过65535条会报错,因为excel2003一个sheet表最多导出65535条,excel2007是10万4000多条限制. 因此遇到这种excel导出 ...

  10. Oracle not in 范围超过 1000 报错问题及解决方案

    问题描述 查询 Oracle 数据库的 SQL 里 IN()  的参数个数超过 1000 个,此问题是由于 oracle 考虑性能问题做出的限制措施. 解决方案 1. 拆分sql的方式: 例如: Se ...

最新文章

  1. 设置网络映射后,电脑重启后自动重连
  2. python一些常用方法_python常用的一些技巧
  3. BOOST_CONSTANTS_GENERATE宏相关用法的测试程序
  4. 简单谈谈js中的MVC
  5. python etree模块所有函数详解_Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件,封装函数...
  6. 中国游戏行业观察报告
  7. dpkg-buildpackage: error: debian/rules binary subprocess was killed by signal 2
  8. php微信投票刷票,微信投票程序源码
  9. Table is marked as crashed and should be repaire
  10. Python爬虫:搜狗(微信,知乎)公众号内容
  11. 计算机网络——Cisco Packet Tracer 实验
  12. 日常交通工具日语词汇
  13. 赚钱游戏APP套路有哪些?
  14. nyoj 980 格子刷油漆
  15. 抢红包算法 c++_字节跳动|垂直策略|算法岗招聘
  16. python算法工程师面试_算法工程师的面试经历及总结
  17. SpringBoot-集成Shiro
  18. java 检测u盘_java实现监听u盘示例分享
  19. IDEA安装激活一条龙服务
  20. 关于php中laravel框架的学习--适合菜鸟初学者

热门文章

  1. 异数OS 织梦师-水母(一)--消息队列篇
  2. GitHub图片加载不出来解决方案(超详细图文教程)
  3. hexo笔记十五:next主题添加网易云外链
  4. 伴随矩阵例题_§6_伴随矩阵及习题_精品.ppt
  5. off-by-one(大小差一)错误介绍
  6. php花瓣,php 网络爬虫,爬一下花瓣的图片
  7. 关于PWA落地问题的思考
  8. python卡尔曼滤波室内定位_基于卡尔曼滤波的室内定位方法设计
  9. 2021年危险化学品经营单位安全管理人员考试及危险化学品经营单位安全管理人员考试资料
  10. 硬盘录像机常见问题解答硬盘录像机故障解决