La raison est que vous incluez le tableau de droite dans WHERE clause. Vous devriez déplacer cela vers ON condition de la LEFT JOIN :
Select P.appId, S.stepId, S.section, P.start
From #appSteps S With (NoLock)
Left Join #appProgress P On S.stepId = P.stepId
And P.appId = 101
Where S.section Is Not Null
La raison pour laquelle il le fait est que le WHERE la clause est évaluée après le LEFT JOIN , qui filtre ensuite votre NULL résulte de la LEFT JOIN .
Inclusion de la table de droite d'un LEFT JOIN (ou la table de gauche d'un RIGHT JOIN ) dans le WHERE la clause transforme efficacement le OUTER JOIN dans un INNER JOIN .