如何优雅的解决sql查询条件用in关键查询结果大于1000报错的问题

如何优雅的解决sql查询条件用in关键查询结果字大于1000报错的问题

背景描述:在实际开发过程中,我们可能会遇到查询条件中用in关键字的情况,在总数据小于1000的情况下完全没问题,执行性能有点影响,但是当数据大于1000时,就会报:ORA-01795:列表中的最大表达式数为1000的错误

解决办法

有将in分成in or in方式的、有将in里面的参数改写成select子句、也有建临时表然后用join关联的,我介绍的是建临时表解决的这种方案,本人也习惯使用这种方式。
获取参数创建临时表,以工单id参数集合举例
String tempTableName = “”;//临时表名
if(param.getWorkId.size() > 1000){//查询的目标参数集合 param.setTempTableName(tempTableService.createTempWorkTable(param.getWorkId()));
tempTableName = param.getTempTableName();
}
//完事后记得删除零时表
if (StringUtils.isNotBlank(tempName)) {
tempTableService.dropTempTable(tempName);
}
//tempTableServiceImpl代码
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public String createTempWorkTableLong(List workIds) {
String tempTablename = TmpTableUtils.getTempTableName(null);
// 创建临时表
tempTableMapper.createTempWorkTable(tempTablename);
if (null == workIds || workIds.isEmpty()) {
return tempTablename;
}
int i = 0;
// 向临时表中批量插入数据
for (; i + 50 < workIds.size(); i += 50) {
tempTableMapper.insertWorkTempTableLong(tempTablename, workIds.subList(i, i + 50));
}
tempTableMapper.insertWorkTempTableLong(tempTablename, workIds.subList(i, workIds.size()));
return tempTablename;
}
//mybatis代码

create table ${tempTbName}(
work_id varchar2(128),
primary key (work_id)
)


INSERT INTO ${tempTbName}(work_id)

SELECT #{item} from dual



DROP TABLE ${tempTbName} purge

剩下的就是自己的业务sql了,改成
select XXX from a join tempTableName b on a.workId = b.workId 这种形式即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值