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 null, la requête ne renvoie rien.
Comment puis-je laisser la dernière partie de la requête AND Table2.IsDefault = 1
facultative?
J'ai essayé de court-circuiter la requête en utilisant OR
mais j'ai découvert qu'elle fonctionnait différemment de C #
SELECT ID, Name, Phone
FROM Table1
LEFT JOIN Table2
ON Table1.ID = Table2.ID AND Table2.IsDefault = 1
WHERE Table1.ID = 12
AND COALESCE(Table2.IsDefault,1) = 1
En lisant les commentaires, il semble que votre meilleure solution consiste en fait à déplacer la condition vers la jointure:
SELECT ID, Name, Phone
FROM Table1
LEFT JOIN Table2 ON Table1.ID = Table2.ID AND Table2.IsDefault = 1
WHERE Table1.ID = 12
Comme il s'agit d'une jointure OUTER, vous conserverez toutes les informations de Table1 en cas d'échec de la correspondance. Étant donné que "Table2 renvoie toujours une entrée", vous ne risquez pas de filtrer des résultats de jointure supplémentaires en déplaçant la condition. Vous obtiendrez les mêmes résultats en plaçant la condition dans la clause WHERE.
La raison pour déplacer la configuration vers la clause ON est que les fonctions COALESCE()
, ISNULL()
et OR
causent toutes des problèmes pour les index. Avec la condition de la clause ON, nous n’avons besoin d’aucune de ces conditions et nous devrions donc nous retrouver avec un meilleur plan d’exécution.
Essaye ça :
SELECT ID, Name, Phone
FROM Table1
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12 AND isnull(Table2.IsDefault,1) = 1
Vous étiez presque là :-)
SELECT ID, Name, Phone FROM Table1
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12
AND (Table2.IsDefault IS NULL OR Table2.IsDefault = 1);
Utilisez une sous-requête pour filtrer les résultats du tableau 2 avant qu’ils ne soient joints au tableau 1:
SELECT ID, Name, Phone
FROM Table1
LEFT JOIN (SELECT * FROM Table2 WHERE IsDefault = 1) AS Table2 ON Table1.ID = Table2.ID
WHERE Table1.ID = 12