Débogage d'un LEFT OUTER JOIN défaillant avec filtrage par date
Un défi courant en matière de requête SQL consiste à utiliser LEFT OUTER JOIN
avec des filtres de date. L'on s'attend à ce que les données de la table de gauche (par exemple, Salesrep
) soient renvoyées même s'il n'y a pas de données correspondantes dans les tables de droite (Prescriber
et Prescriptions
). Cependant, l'ajout de filtres de date à la clause WHERE
peut filtrer de manière inattendue les enregistrements de la table de gauche.
Comprendre le problème :
Le problème vient de la localisation des conditions de plage de dates. Les placer dans la clause WHERE
filtre incorrectement les résultats après la jointure, supprimant ainsi les lignes du tableau de gauche qui manquent d'entrées correspondantes dans la plage de dates spécifiée.
La bonne approche :
Pour maintenir l'intégrité du LEFT OUTER JOIN
, les critères de plage de dates doivent être incorporés dans la clause ON
de la jointure elle-même. Cela garantit que le filtrage se produit pendant la jointure, préservant tous les enregistrements de la table de gauche, quelles que soient les prescriptions correspondantes dans la plage de dates.
Requête révisée :
<code class="language-sql">LEFT OUTER JOIN prescriptions ON prescriber.dea_no = prescriptions.dea_no AND prescriptions.filldate >= '09-01-12' AND prescriptions.filldate <= '09-30-12'</code>
En déplaçant les filtres de date vers la clause ON
, la requête renvoie avec précision toutes les données de la table Salesrep
, y compris les représentants commerciaux sans ordonnance dans le délai spécifié. Cela implémente correctement le comportement attendu d'un LEFT OUTER JOIN
.
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!