如何实现仅当查询A.1无结果时才执行查询A.2?
用带条件的UNION ALL实现按需执行查询
可以通过带条件的UNION ALL实现你的需求:优先返回Query A.1的结果,只有当A.1无数据时,Query A.2才会返回数据。核心是给A.2添加一个判断条件,确认A.1没有结果后才执行。
最终SQL代码
-- Query A:优先返回A.1结果,无结果时返回A.2 SELECT LE_AGENDA_FK, LE_CODE, LE_ID, LE_KLAS_FK, LE_KLASPARTITIE_FK, LE_OMSCHRIJVING, LE_VERANDERDDOOR, LE_VERANDERDOP , Count(LH_ID) As AantalLln FROM LESEENHEID LEFT JOIN LOOPBAANLESEENHEID on (LH_LESEENHEID_FK = LE_ID) LEFT JOIN LOOPBAAN ON (LH_LOOPBAAN_FK = LB_ID) WHERE ('2022/09/28' BETWEEN LB_VAN AND LB_TOT) AND (LE_ID in (8277)) GROUP BY LE_AGENDA_FK, LE_CODE, LE_ID, LE_KLAS_FK, LE_KLASPARTITIE_FK, LE_OMSCHRIJVING, LE_VERANDERDDOOR, LE_VERANDERDOP UNION ALL SELECT LE_AGENDA_FK, LE_CODE, LE_ID, LE_KLAS_FK, LE_KLASPARTITIE_FK, LE_OMSCHRIJVING, LE_VERANDERDDOOR, LE_VERANDERDOP, 0 As AantalLln FROM LESEENHEID WHERE (LE_ID in (8277)) -- 关键判断:仅当A.1无结果时才执行此查询 AND NOT EXISTS ( SELECT 1 FROM LESEENHEID LEFT JOIN LOOPBAANLESEENHEID on (LH_LESEENHEID_FK = LE_ID) LEFT JOIN LOOPBAAN ON (LH_LOOPBAAN_FK = LB_ID) WHERE ('2022/09/28' BETWEEN LB_VAN AND LB_TOT) AND (LE_ID in (8277)) GROUP BY LE_AGENDA_FK, LE_CODE, LE_ID, LE_KLAS_FK, LE_KLASPARTITIE_FK, LE_OMSCHRIJVING, LE_VERANDERDDOOR, LE_VERANDERDOP ) ORDER BY LE_ID ROWS 1000
逻辑说明
- 第一部分(A.1):正常执行原聚合查询,返回符合日期条件的结果。
- 第二部分(A.2):通过
NOT EXISTS子句检查A.1是否有返回数据:- 如果A.1有结果,
NOT EXISTS返回假,这部分查询不会产生任何数据; - 如果A.1无结果,
NOT EXISTS返回真,这部分查询会返回预设AantalLln=0的记录。
- 如果A.1有结果,
- 统一排序:将
ORDER BY放在整个语句末尾,避免子查询中出现排序导致的语法问题(部分数据库不允许子查询带排序)。
备选方案(流程控制语法)
如果你的数据库支持流程控制语句(如SQL Server、MySQL),也可以用以下方式,逻辑更直观:
-- 先检查A.1是否有结果 IF EXISTS ( SELECT 1 FROM LESEENHEID LEFT JOIN LOOPBAANLESEENHEID on (LH_LESEENHEID_FK = LE_ID) LEFT JOIN LOOPBAAN ON (LH_LOOPBAAN_FK = LB_ID) WHERE ('2022/09/28' BETWEEN LB_VAN AND LB_TOT) AND (LE_ID in (8277)) GROUP BY LE_AGENDA_FK, LE_CODE, LE_ID, LE_KLAS_FK, LE_KLASPARTITIE_FK, LE_OMSCHRIJVING, LE_VERANDERDDOOR, LE_VERANDERDOP ) BEGIN -- 执行A.1 SELECT LE_AGENDA_FK, LE_CODE, LE_ID, LE_KLAS_FK, LE_KLASPARTITIE_FK, LE_OMSCHRIJVING, LE_VERANDERDDOOR, LE_VERANDERDOP , Count(LH_ID) As AantalLln FROM LESEENHEID LEFT JOIN LOOPBAANLESEENHEID on (LH_LESEENHEID_FK = LE_ID) LEFT JOIN LOOPBAAN ON (LH_LOOPBAAN_FK = LB_ID) WHERE ('2022/09/28' BETWEEN LB_VAN AND LB_TOT) AND (LE_ID in (8277)) GROUP BY LE_AGENDA_FK, LE_CODE, LE_ID, LE_KLAS_FK, LE_KLASPARTITIE_FK, LE_OMSCHRIJVING, LE_VERANDERDDOOR, LE_VERANDERDOP END ELSE BEGIN -- 执行A.2 SELECT LE_AGENDA_FK, LE_CODE, LE_ID, LE_KLAS_FK, LE_KLASPARTITIE_FK, LE_OMSCHRIJVING, LE_VERANDERDDOOR, LE_VERANDERDOP,0 As AantalLln FROM LESEENHEID WHERE (LE_ID in (8277)) ORDER BY LE_ID ROWS 1000 END
内容的提问来源于stack exchange,提问作者Tonathiu Redrovan
相关产品推荐
相关产品推荐

