Oracle LEFT JOIN正确使用:返回无PI/PD角色的提案数据
解决方法
你的问题出在WHERE子句的过滤逻辑上:当某个提案在EPS_PROP_PERSON表中有其他角色(非PI/PD)的记录时,pers.PROP_PERSON_ROLE_ID既不是NULL也不是'PI'/'PD',会被WHERE条件过滤掉,导致这条提案完全不显示。
要保留所有EPS_PROPOSAL的记录,同时只关联PI/PD角色的人员信息(没有的话显示NULL),需要把角色筛选条件从WHERE移到LEFT JOIN的ON子句中:
SELECT eps.PROPOSAL_NUMBER, pers.PROP_PERSON_ROLE_ID, pers.FULL_NAME, pers.HOME_UNIT FROM EPS_PROPOSAL eps LEFT JOIN EPS_PROP_PERSON pers ON eps.PROPOSAL_NUMBER = pers.PROPOSAL_NUMBER AND (pers.PROP_PERSON_ROLE_ID = 'PI' OR pers.PROP_PERSON_ROLE_ID = 'PD');
逻辑说明:
- 使用
LEFT JOIN确保EPS_PROPOSAL的所有记录都会被返回,不管有没有匹配的人员记录 - 将角色筛选条件放到
ON子句里,只会关联符合PI/PD角色的人员行;如果提案没有PI/PD,pers相关列就会显示NULL - 去掉原WHERE子句的过滤,避免把有其他角色但无PI/PD的提案排除在外
这样查询结果就会包含全部4504条提案,其中那21条无PI/PD的提案会显示PROPOSAL_NUMBER,其余pers列值为NULL。
内容的提问来源于stack exchange,提问作者user1492226
相关产品推荐
相关产品推荐

