业务场景
遇见了查询数据需要从两个表中分别根据其中状态进行查询。
问题:
如果同时查询未上报和医保已接收数据,条件会变成
IN A(0,10) AND B(0,-9)
这样就会把A中0状态的数据也进行B的筛选,可能少数据了。
解决方案一
直接用AB表状态进行筛选,or配合条件。
但是在过于流程化了,即 太多的if条件判断了。
业务逻辑图一:
解决方案二
根据客户端勾选的状态,依次去查询数据,若复选多个则sql查询多次,根据查询出来的数据进行一个聚合返回给分页插件。
该种方案暂时行不通,因为Mybatis
中的PageHelper
是根据紧跟PageHelper.startPage()
后的第一个SQL语句进行分页查询的,多个查询语句会导致分页插件失效,聚合起来后也没法使用,若需使用,需要自己写一个分页流程语句。
弃用原因:
1.多次sqlsession请求查询有压力
2.聚合后的数据无法使用Mybatis的自带分页插件,需要自定义一个
业务逻辑图二:
最终解决方案
将AB表合成一个视图,聚合为一个状态表,然后查询这个状态表单状态查询就可以了。
最终业务逻辑图:
视图语句
create or replace view MEDICAL_DATA_UPLOAD.V_UPLOAD_TASK_QUERY_RESULT as
select DATA_PID,
UPLOAD_TYPE,
LAST_UPLOAD_TIME,
UPLOAD_RESULT,
ut.GMT_CREATE UT_GMT_CREATE,
ut.GMT_MODIFIED UT_GMT_MODIFIED,
IS_DELETE,
ut.ID UT_ID,
ut.SETL_ID UT_SETL_ID,
qr.ID QR_ID,
RETRY_TIMES,
qr.SETL_ID QR_SETL_ID,
INS_RECEIVE_TIME,
REQUEST_PARAM,
RESPONSE_PARAM,
qr.GMT_CREATE QR_GMT_CREATE,
qr.GMT_MODIFIED QR_GMT_MODIFIED,
UPLOAD_STATUS,
QUERY_STATUS,
case
when ut.UPLOAD_STATUS = 0 then 0
when qr.QUERY_STATUS = 10 then 5
when ut.UPLOAD_STATUS = 10 and qr.QUERY_STATUS in (0,-9) then 10
when ut.UPLOAD_STATUS = -9 then -9
end status
from MEDICAL_DATA_UPLOAD.UPLOAD_TASK ut
left join MEDICAL_DATA_UPLOAD.QUERY_RESULT qr on qr.upload_task_id = ut.id;
-- drop view MEDICAL_DATA_UPLOAD.V_UPLOAD_TASK_QUERY_RESULT