2011-02-09 16 views
9

C'è qualche argomento, per quanto riguarda le prestazioni, da filtrare nel join, al contrario della clausola WHERE?Filtraggio sull'unione?

Per esempio,

SELECT blah FROM TableA a 
INNER JOIN TableB b 
ON b.id = a.id 
AND b.deleted = 0 
WHERE a.field = 5 

al contrario di

SELECT blah FROM TableA a 
INNER JOIN TableB b 
ON b.id = a.id 
WHERE a.field = 5 
    AND b.deleted = 0 

io personalmente preferisco la seconda, perché mi sento di filtraggio dovrebbe essere fatto nella sezione di filtraggio (WHERE), ma c'è ogni performance o altri motivi per fare entrambi i metodi?

+0

duplicato di [WHERE Clausola vs ON quando si utilizza JOIN] (https://stackoverflow.com/questions/10297231/where-clause-vs-on-when-using-join) (sì, questo implica il viaggio nel tempo ma a un'occhiata ha risposte leggermente migliori) –

risposta

17

Se Query Optimizer fa il suo lavoro, non c'è alcuna differenza (eccetto la chiarezza per gli altri) nelle due forme per i join interni.

Detto questo, con join sinistro una condizione nel join significa filtrare le righe dal secondo tavolo prima di unirsi. Una condizione nel dove significa filtrare le righe dal risultato finale dopo l'adesione. Quelli significano cose molto diverse.

+4

+1. per evidenziare la differenza –

+0

+1 SQL profiler riporta esattamente lo stesso numero di letture – kelloti

0

credo che questo è quello che stai cercando >>SQL join: where clause vs. on clause

+0

Se ritieni che la domanda sia duplice, contrassegnala semplicemente come una, invece di aggiungere una risposta di solo collegamento che non fornisce alcun contenuto. –

0

Non v'è alcuna differenza tra questi due, perché nel settore della trasformazione logica della query, WHERE sarà sempre andare a destra dopo la clausola di filtro (ON), nei tuoi esempi si avrà:

  1. prodotto cartesiano (numero di righe da TableA x numero di righe da TableB)
  2. Filter (ON)
  3. Dove.

I suoi esempi sono in ANSI SQL-92 standard, si potrebbe anche scrivere la query con ANSI SQL-89 standard come questo:

SELECT blah FROM TableA a,TableB b 
WHERE b.id = a.id AND b.deleted = 0 AND a.field = 5 

questo è vero per inner join, CON ESTERNO SI UNISCE STA SIMILE MA NON LO STESSO

0

Con i giunti interni si avranno gli stessi risultati e probabilmente le stesse prestazioni. Tuttavia, con outer join le due query restituirebbero risultati diversi e non sono affatto equivalenti, in quanto l'inserimento della condizione nella clausola where cambierà la query da un join sinistro a un inner join (a meno che non si stiano cercando i record in cui alcuni il campo è nullo).