为何Left Join未返回ParentRoleID为NULL的记录?
问题分析与解决
你的问题出在WHERE子句中的srj.isDeleted=0——左连接后,那些没有父角色的行里,srj相关的所有字段都是NULL,而NULL = 0的判断结果不成立,所以这部分行被WHERE条件过滤掉了,最终只返回了有匹配父角色的40条记录。
要实现返回sr表所有未删除行的需求,只需把srj.isDeleted=0从WHERE子句移到JOIN的ON条件里,这样左连接时只会匹配未被删除的父角色,同时保留主表(sr)的所有行:
select sr.Name, srj.Name as ParentSR from Role sr left join Role srj on sr.id = srj.ParentRoleId and srj.isDeleted = 0 where sr.isDeleted = 0
逻辑说明
- 主表
sr的过滤条件sr.isDeleted=0留在WHERE子句,确保只返回未被删除的角色 - 把父角色的未删除条件放到ON子句,左连接时只会关联符合条件的父角色,没有父角色的行依然会被保留,此时
ParentSR字段会显示为NULL
内容的提问来源于stack exchange,提问作者testy
相关产品推荐
相关产品推荐

