Maison >base de données >tutoriel mysql >Pourquoi des lignes manquent-elles dans mon résultat de jointure gauche ?
Différence de jointure gauche : lignes omises
Dans cette requête, le LEFT JOIN entre les tables #appSteps et #appProgress fonctionne mal, ce qui entraîne le exclusion des lignes attendues de l'ensemble de résultats.
Requête dans Question :
select p.appId, s.stepId, s.section, p.start from #appSteps s with (nolock) left join #appProgress p on s.stepId = p.stepId where s.section is not null and p.appId = 101
Résultat attendu :
appId | stepId | section | start |
---|---|---|---|
101 | 1 | Section 1 | 2016-01-03 00:00:00.000 |
101 | 2 | Section 2 | 2016-01-03 00:00:00.000 |
101 | 10 | Section 3 | NULL |
Résultat réel :
appId | stepId | section | start |
---|---|---|---|
101 | 1 | Section 1 | 2016-01-03 00:00:00.000 |
101 | 2 | Section 2 | 2016-01-03 00:00:00.000 |
Résolution :
Le comportement erroné résulte de l'inclusion du table de droite (#appProgress) dans la clause WHERE. En déplaçant cette condition vers la clause ON du LEFT JOIN, le résultat souhaité peut être obtenu :
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
Dans un LEFT JOIN, la clause WHERE est exécutée après la jointure, ce qui signifie que les lignes de droite- Les tables manuelles qui ne répondent pas aux critères de la clause WHERE seront exclues du jeu de résultats. L'inclusion de la table de droite dans la clause WHERE la transforme effectivement en INNER JOIN, filtrant les résultats attendus.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!