Clause LEFT JOIN SQL Server et WHERE
Voici mon code
SELECT ID, Name, Phone
FROM Table1
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12 AND Table2.IsDefault = 1
Le problème se produit lorsque Table2 est nulle, de sorte que la requête ne retourne rien.
Comment puis-je laisser la dernière partie de la requête AND Table2.IsDefault = 1
facultatif?
J'ai essayé de court-circuit de la requête à l'aide de OR
mais j'ai trouvé que cela fonctionne différent de C#
source d'informationauteur Felipe Miosso
Vous devez vous connecter pour publier un commentaire.
La lecture des commentaires, il ressemble à la meilleure solution est en fait de déplacer la condition de jointure:
Parce que c'est une jointure EXTERNE, vous devez toujours garder toute Table1 information si le match est en panne, et compte tenu de la déclaration que "Table2 retournera toujours 1 entrée" vous n'êtes pas risquer de filtrage supplémentaire rejoindre résultats par le déplacement de la condition. Vous obtiendrez la même résultats comme le placement de la condition de la clause where.
La raison pour déplacer le conidtion à la clause est que le
COALESCE()
ISNULL()
etOR
tous causer des problèmes pour les index. Avec la condition dans la clause, nous n'avons pas besoin de personnes, et devrait donc retrouver avec un meilleur plan d'exécution.Essayez ceci :
Vous avez été près de là 🙂
Utiliser une sous-requête pour filtrer les résultats de Tableau 2 avant d'être rejoint Tableau 1: