Oracle多状态表关联查询 仅展示选中状态的实现方案咨询
不需要编写UNION语句实现,直接使用关联条件前置过滤+动态字段拼接的方案更优,实现逻辑如下:
前置准备
首先把前端传入的多选状态列表拆分为两个独立集合:
- A类选中状态集合:和aCaseStatus字典表的描述字段匹配的选中值
- B类选中状态集合:和bCaseStatus字典表的描述字段匹配的选中值
可以提前给两类状态的编码/描述加固定前缀(如A类加
A_前缀、B类加B_前缀),避免两类状态描述重复,提升拆分效率。
核心查询逻辑
在关联字典表时直接加过滤条件,返回时仅拼接匹配到的选中状态即可,MySQL示例代码如下:
SELECT c.caseId, c.caseType, c.last_name, c.first_Name, -- 仅拼接匹配到的选中状态,无匹配值自动忽略 CONCAT_WS(',', IF(a.status_desc IS NOT NULL, a.status_desc, NULL), IF(b.status_desc IS NOT NULL, b.status_desc, NULL) ) AS caseStatus, c.created_by FROM `case` c -- 内连A类状态字典时直接过滤选中值 INNER JOIN aCaseStatus a ON c.aCaseStatus = a.status_id AND a.status_desc IN (<拆分后的A类选中状态集合>) -- 左连B类状态字典时直接过滤选中值 LEFT JOIN bCaseStatus b ON c.bCaseStatus = b.status_id AND b.status_desc IN (<拆分后的B类选中状态集合>) -- 过滤掉两类状态都未匹配的无效数据 WHERE a.status_id IS NOT NULL OR b.status_id IS NOT NULL
方案优势
- 性能更高:不需要两次扫描case业务表,也不需要做结果合并,关联阶段就过滤掉了非选中状态,数据扫描量远低于UNION方案
- 逻辑更简洁:不需要处理UNION的字段对齐、结果去重问题,后续新增状态类型时只需要新增对应关联逻辑,维护成本更低
- 兼容性强:如果后续需要支持单case匹配多个选中状态同时展示的场景,不需要修改整体结构,只需要调整拼接逻辑即可
仅当两类状态的描述/编码完全重合、无法拆分AB类选中集合的特殊场景下,才需要使用UNION方案:分别查询匹配A类状态的case列表、匹配B类状态的case列表,再合并结果去重返回即可。
内容的提问来源于stack exchange,提问作者Geek
相关产品推荐
相关产品推荐

