一,在开发中我们使用union函数或者union all使用分页插件进行分页会出现错误如下:
SELECT * FROM (SELECT
a.T_POM_JOB_ACT_PRODUCT_ID,
a.T_POM_JOB_ORDER_ID,
a.PRODUCT_SORT,
e.DOC_NO,
a.PRODUCT_SN,
a.M_COM_MATERIAL_ID,
c.MATERIAL_NAME,
c.MATERIAL_NO,
a.DOC_STATUS,
e.EST_DELIVERY_DT,
a.PRODUCT_STATUS,
d.DICT_NAME as productStatusName,
e.MACHINE_NO,
e.MACHINE_TYPE,
e.VOLTAGE,
s.SEG_NAME,
s.SEG_CODE,
s.OPERATION_TYPE,
e.SCH_START_DT
FROM
t_pom_job_act_product a
LEFT JOIN m_com_material c ON a.M_COM_MATERIAL_ID = c.M_COM_MATERIAL_ID
LEFT JOIN t_pom_job_order e ON a.T_POM_JOB_ORDER_ID = e.T_POM_JOB_ORDER_ID
LEFT JOIN m_com_process_seg s ON a.M_WORKFLOW_SPEC_LAST_NODE_ID = s.M_COM_PROCESS_SEG_ID
LEFT JOIN m_data_dict d on d.DICT_CODE = a.PRODUCT_STATUS and d.DICT_TYPE = 'PRODUCT_STATUS'
where
a.PRODUCT_STATUS = "START"
AND
e.FEVOR = "206"
AND a.M_WORKFLOW_SPEC_LAST_NODE_ID in
<foreach collection="specLastNodeIdList" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
UNION
SELECT
a.T_POM_JOB_ACT_PRODUCT_ID,
a.T_POM_JOB_ORDER_ID,
a.PRODUCT_SORT,
e.DOC_NO,
a.PRODUCT_SN,
a.M_COM_MATERIAL_ID,
c.MATERIAL_NAME,
c.MATERIAL_NO,
a.DOC_STATUS,
e.EST_DELIVERY_DT,
a.PRODUCT_STATUS,
d.DICT_NAME as productStatusName,
e.MACHINE_NO,
e.MACHINE_TYPE,
e.VOLTAGE,
s.SEG_NAME,
s.SEG_CODE,
s.OPERATION_TYPE,
e.SCH_START_DT
FROM
t_pom_job_act_product a
LEFT JOIN m_com_material c ON a.M_COM_MATERIAL_ID = c.M_COM_MATERIAL_ID
LEFT JOIN t_pom_job_order e ON a.T_POM_JOB_ORDER_ID = e.T_POM_JOB_ORDER_ID
LEFT JOIN m_com_process_seg s ON a.M_WORKFLOW_SPEC_LAST_NODE_ID = s.M_COM_PROCESS_SEG_ID
LEFT JOIN m_data_dict d on d.DICT_CODE = a.PRODUCT_STATUS and d.DICT_TYPE = 'PRODUCT_STATUS'
where
a.PRODUCT_STATUS != "START" AND a.PRODUCT_STATUS != "Outbound"
AND
e.FEVOR = "206"
AND a.WORK_STATION = #{workStation}
) AS b
<where>
<if test="date != null and date != ''">
AND DATE_FORMAT(b.SCH_START_DT,'%Y-%m-%d') <![CDATA[<= ]]> #{date}
</if>
<if test="productSn != null and productSn != ''">
AND b.PRODUCT_SN like concat ('%',#{productSn},'%')
</if>
<if test="docNo != null and docNo != ''">
AND b.DOC_NO like concat ('%',#{docNo},'%')
</if>
</where>
ORDER BY b.PRODUCT_SORT ASC
这个查询在使用分页插件时会出问题
二:我们可以建视图进行查询这样可以避免这个错误
视图如下:
select '01' AS `query_type`,`a`.`WORK_STATION` AS `work_station`,`a`.`IS_DELETED` AS `is_deleted`,`a`.`M_WORKFLOW_SPEC_LAST_NODE_ID` AS `m_workflow_spec_last_node_id`,`a`.`T_POM_JOB_ACT_PRODUCT_ID` AS `t_pom_job_act_product_id`,`a`.`T_POM_JOB_ORDER_ID` AS `t_pom_job_order_id`,`a`.`PRODUCT_SORT` AS `product_sort`,`e`.`DOC_NO` AS `doc_no`,`a`.`PRODUCT_SN` AS `product_sn`,`a`.`M_COM_MATERIAL_ID` AS `m_com_material_id`,`c`.`MATERIAL_NAME` AS `material_name`,`c`.`MATERIAL_NO` AS `material_no`,`a`.`DOC_STATUS` AS `doc_status`,`e`.`EST_DELIVERY_DT` AS `est_delivery_dt`,`a`.`PRODUCT_STATUS` AS `product_status`,`d`.`DICT_NAME` AS `productstatusname`,`e`.`MACHINE_NO` AS `machine_no`,`e`.`MACHINE_TYPE` AS `machine_type`,`e`.`VOLTAGE` AS `voltage`,`s`.`SEG_NAME` AS `seg_name`,`s`.`SEG_CODE` AS `seg_code`,`s`.`OPERATION_TYPE` AS `operation_type`,`e`.`SCH_START_DT` AS `sch_start_dt` from ((((`t_pom_job_act_product` `a` left join `m_com_material` `c` on((`a`.`M_COM_MATERIAL_ID` = `c`.`M_COM_MATERIAL_ID`))) left join `t_pom_job_order` `e` on((`a`.`T_POM_JOB_ORDER_ID` = `e`.`T_POM_JOB_ORDER_ID`))) left join `m_com_process_seg` `s` on((`a`.`M_WORKFLOW_SPEC_LAST_NODE_ID` = `s`.`M_COM_PROCESS_SEG_ID`))) left join `m_data_dict` `d` on(((`d`.`DICT_CODE` = `a`.`PRODUCT_STATUS`) and (`d`.`DICT_TYPE` = 'PRODUCT_STATUS')))) where ((`a`.`PRODUCT_STATUS` = 'Start') and (`e`.`FEVOR` = '206')) union select '02' AS `query_type`,`a`.`WORK_STATION` AS `work_station`,`a`.`IS_DELETED` AS `is_deleted`,`a`.`M_WORKFLOW_SPEC_LAST_NODE_ID` AS `m_workflow_spec_last_node_id`,`a`.`T_POM_JOB_ACT_PRODUCT_ID` AS `t_pom_job_act_product_id`,`a`.`T_POM_JOB_ORDER_ID` AS `t_pom_job_order_id`,`a`.`PRODUCT_SORT` AS `product_sort`,`e`.`DOC_NO` AS `doc_no`,`a`.`PRODUCT_SN` AS `product_sn`,`a`.`M_COM_MATERIAL_ID` AS `m_com_material_id`,`c`.`MATERIAL_NAME` AS `material_name`,`c`.`MATERIAL_NO` AS `material_no`,`a`.`DOC_STATUS` AS `doc_status`,`e`.`EST_DELIVERY_DT` AS `est_delivery_dt`,`a`.`PRODUCT_STATUS` AS `product_status`,`d`.`DICT_NAME` AS `productstatusname`,`e`.`MACHINE_NO` AS `machine_no`,`e`.`MACHINE_TYPE` AS `machine_type`,`e`.`VOLTAGE` AS `voltage`,`s`.`SEG_NAME` AS `seg_name`,`s`.`SEG_CODE` AS `seg_code`,`s`.`OPERATION_TYPE` AS `operation_type`,`e`.`SCH_START_DT` AS `sch_start_dt` from ((((`t_pom_job_act_product` `a` left join `m_com_material` `c` on((`a`.`M_COM_MATERIAL_ID` = `c`.`M_COM_MATERIAL_ID`))) left join `t_pom_job_order` `e` on((`a`.`T_POM_JOB_ORDER_ID` = `e`.`T_POM_JOB_ORDER_ID`))) left join `m_com_process_seg` `s` on((`a`.`M_WORKFLOW_SPEC_LAST_NODE_ID` = `s`.`M_COM_PROCESS_SEG_ID`))) left join `m_data_dict` `d` on(((`d`.`DICT_CODE` = `a`.`PRODUCT_STATUS`) and (`d`.`DICT_TYPE` = 'PRODUCT_STATUS')))) where ((`a`.`PRODUCT_STATUS` <> 'Start') and (`a`.`PRODUCT_STATUS` <> 'Outbound') and (`e`.`FEVOR` = '206'))
三:代码里面使用查询
SELECT * FROM v_pom_job_act_product
<where>1=1
AND
((query_type = '01'
<if test="specLastNodeIdList != null and specLastNodeIdList.size() != 0">
AND m_workflow_spec_last_node_id in
<foreach collection="specLastNodeIdList" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
)
OR
(query_type = '02' and work_station = #{workStation} ))
<if test="date != null and date != ''">
AND ( DATE_FORMAT(sch_start_dt,'%Y-%m-%d') <![CDATA[<= ]]>
#{date})
</if>
<if test="productSn != null and productSn != ''">
AND (product_sn like concat ('%',#{productSn},'%'))
</if>
<if test="docNo != null and docNo != ''">
AND (doc_no like concat ('%',#{docNo},'%'))
</if>
</where>
ORDER BY product_sort ASC,product_sn ASC
就可以实现