数据库使用的是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等。