为什么左联接未返回不匹配的记录


select sr.Name, srj.Name as ParentSR from Role sr
left join Role srj
on sr.id= srj.ParentRoleId
where sr.isDeleted= 0 and srj.isDeleted= 0

现在我有190条记录,其中只有40条具有ParentRoleId,但当我运行此查询时,它只返回40条相同的记录,这些记录只有parentID,但没有ParentRoleId=NULL的记录。我希望它返回角色sr的每一行,但它没有发生。

当使用左外部联接时,如果希望该联接可能不匹配的行,则必须小心where子句不会从最终结果中抑制不匹配的列。

实现这一点的一种方法是将谓词转换为额外的连接条件

select sr.Name, srj.Name as ParentSR 
from Role sr
left join Role srj
on sr.id = srj.ParentRoleId
and srj.isDeleted = 0           --<< was in the where clause
where sr.isDeleted= 0

或者在where子句中明确允许NULL,例如

select sr.Name, srj.Name as ParentSR 
from Role sr
left join Role srj
on sr.id = srj.ParentRoleId  
where sr.isDeleted= 0
and (srj.isDeleted = 0 or srj.ParentRoleId IS NULL)

最新更新