能否优化该SQL查询?需求移除Union关键字
SQL查询优化(移除UNION关键字)
优化后的SQL
SELECT COALESCE(ORTABLE.SYSPERSUITV, WATABLE.FK_RESOURCE_PERSON) AS PERSON_ID FROM ORD_NOARCHIVE ORTABLE FULL OUTER JOIN PLN_WORKASSIGNMENT WATABLE ON ORTABLE.SYSPERSUITV = WATABLE.FK_RESOURCE_PERSON WHERE -- 原第一个查询的筛选条件 (ORTABLE.STANDAARD = 'F' AND ORTABLE.BEHCODE = 'BP' AND ORTABLE.SYSPERSUITV IS NOT NULL AND ORTABLE.ARCHIEF = 'F') -- 原第二个查询的筛选条件,且排除已在第一个表中存在的记录 OR (WATABLE.BEHCODE = 'BP' AND WATABLE.IS_ARCHIVED = 'F' AND ORTABLE.SYSPERSUITV IS NULL)
逻辑说明
- 用
FULL OUTER JOIN关联两个表,关联键为人员ID字段(SYSPERSUITV和FK_RESOURCE_PERSON) - WHERE子句拆分两部分逻辑,完全匹配原UNION查询的业务需求:
- 第一部分直接筛选
ORD_NOARCHIVE中符合条件的人员ID - 第二部分筛选
PLN_WORKASSIGNMENT中符合条件,且未在ORD_NOARCHIVE出现过的人员ID
- 第一部分直接筛选
COALESCE函数用来统一结果列的取值,确保输出字段一致
额外优化建议
- 移除原SQL中冗余的
WHERE 1=1,无动态拼接条件时该语句无实际作用 - 建议创建复合索引提升查询效率:
- 给
ORD_NOARCHIVE表创建索引:(STANDAARD, BEHCODE, ARCHIEF, SYSPERSUITV) - 给
PLN_WORKASSIGNMENT表创建索引:(BEHCODE, IS_ARCHIVED, FK_RESOURCE_PERSON)
- 给
内容的提问来源于stack exchange,提问作者dinesh barado
相关产品推荐
相关产品推荐

