SpringCloud 框架 oracle数据库 按月分表查询

数据库使用的是oracle ,表名tradelog_202101  ,  tradelog_202102  , tradelog_202103  ...这样分的月表  表结构  userid 用户id  , money 金额 , tradetime   交易时间 yyyyMMdd    现在要动态更具时间查询交易记录需要多表查询.

如果不是根据表里面的数据,动态去选择连表,那就很好做,直接拼接sql就行了。

如果是根据表里面的数据 比如你第一条4月,第二条3月 这种去连表的话,mybatis resultMap可以实现,不过他的实现原理,还是主表查出多少条,然后连月份表,执行的sql条数等于你的主表数据条数+1;

这种如果不是公司技术规范限制的话,那还不如分开查询,自己根据时间分组查主表以后,根据月份去选择连表,这样最少执行的sql就是2条,极限是主表条数+1,效率比mybatis resultMap效率高

1. 先模糊查询出所有表名 show tables likes 'tradelog_%',把所有表名封装为一个集合

2. 用 mybatis 中的 <foreach> 标签,遍历这个表名集合查询就行了

 

用这个union all拼接sql再查询,你表名前面一样的后面的年月可以根据查询的条件来用两个for循环自己拼接。

提供一个思路

既然是只根据时间来查询,那就可以判断查询参数的时间具体属于哪个月份,直接去找对应的表就行,如果跨了多张表就用union

表名当作参数进行传入即可,根据传入时间,获取到年月份列表(当然这种的站在业务角度上也不可能没有限制,比如可以提供三个月的查询),然后按规则拼接成列表,使用mybitis  foreach 遍历查询即可。如果上级一定要求全部数据可查,且查询频率比较高的话,可能需要采用一些其他的解决方案,比如使用ES等。