Faites juste attention de la différence avec les jointures externes
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);
N'est pas le même que
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE b.IsApproved = 1;
Depuis pour "échoué" jointures externes sur la Barre, b.IsApproved
sera toujours NULL
et, partant, de les filtrer.
Une autre façon de voir c'est que pour l' LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId)
, que le filtre additionnel (b.IsApproved = 1)
sera ignoré si la jointure (b.BarId = f.BarId)
échoue, car le LEFT/RIGHT OUTER JOIN garantit la GAUCHE / DROITE des lignes de la table seront conservés même si la jointure échoue.
Mise à jour:
Pour répondre à la question posée par Conrad, l'équivalent de la LOJ pour un filtre OPTIONNEL serait:
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE
(b.IsApproved IS NULL OR b.IsApproved = 1);
c'est à dire OÙ La clause doit considérer à la fois la condition si la jointure échoue (NULL) et le filtre doit être ignoré, et où la jointure réussit et que le filtre doit être appliqué. (b.IsApproved
ou b.BarId
a pu être testé pour les NULS)