Basta fare attenzione alla differenza con i giunti esterni. Una query in cui viene aggiunto un filtro di b.IsApproved
(sul tavolo a destra, Bar) alla ON
condizione del JOIN
:
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);
è NON lo stesso come mettere il filtro nella clausola WHERE
:
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved = 1);
Dal momento che per 'fallito' outer join a Bar
(cioè dove non c'è b.BarId
per un f.BarId
), questo lascerà b.IsApproved
come NULL
per tutti come fa Iled unisce le righe e queste verranno quindi filtrate.
Un altro modo di vedere questo è che per la prima interrogazione, LEFT OUTER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId)
sarà sempre tornare le righe della tabella SINISTRA, dal momento che garantisce LEFT OUTER JOIN
le righe della tabella SINISTRA saranno restituiti anche se il join non riesce. Tuttavia, l'effetto dell'aggiunta diallo stato LEFT OUTER JOIN
a condizione è di escludere qualsiasi colonna della tabella destra quando (b.IsApproved = 1)
è falso, vale a dire secondo le stesse regole normalmente applicate a una condizione LEFT JOIN
su (b.BarId = f.BarId)
.
Aggiornamento: Per completare la domanda posta da Conrad, il LOJ equivalente per un filtro opzionale sarebbe:
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved IS NULL OR b.IsApproved = 1);
cioè la WHERE
clausola deve considerare sia la condizione se il join non riesce (NULL)
e il filtro deve essere ignorato e dove l'unione riesce e il filtro deve essere applicato.(b.IsApproved
o b.BarId
potrebbe essere testato per NULL
)
ho messo un SqlFiddle together here che dimostra le differenze tra i vari piazzamenti del b.IsApproved
del filtro rispetto al JOIN
.
Ecco una domanda simile: http://stackoverflow.com/questions/2509987/which-sql-query-is-faster-filter-on-join-criteria-or-where-clause –
La macchina lo capirà e ottimizzarlo correttamente. Tuttavia, per gli umani che dovranno eseguire il debug \ modify \ supportano il tuo codice da anni, mantieni le condizioni di filtraggio in 'WHERE' e unisciti alle condizioni in' ON'. –
@ KM. Non so sempre come distinguere tra una condizione di join e un filtro. Ad esempio [in questa risposta] (http://stackoverflow.com/a/9303069/119477) Penso che sia meglio nel join, quindi una "condizione di Join", quindi? [Ecco un altro esempio] (http://stackoverflow.com/a/6473403/119477) che non so nemmeno come riscrivere l'equivalente clausola where. –