web-dev-qa-db-fra.com

Clause SQL Server LEFT JOIN 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 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 #

15
Felipe Miosso
SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN Table2 
ON Table1.ID = Table2.ID AND Table2.IsDefault = 1
WHERE Table1.ID = 12
29
t-clausen.dk
 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.

2
Joel Coehoorn

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à :-)

1
Laurent S.
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);
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
0
hargobind