2011-02-09 12 views
9

¿Hay algún argumento, basado en el rendimiento, para filtrar en la unión, en oposición a la cláusula WHERE?FIltering en la unión?

Por ejemplo,

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

en contraposición a

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

yo personalmente prefiero este último, porque me siento filtrado debe hacerse en la sección de filtrado (DONDE), pero ¿hay alguna actuación u otras razones para hacer cualquier método?

+0

duplicado de [cláusula WHERE vs ON al usar JOIN] (https://stackoverflow.com/questions/10297231/where-clause-vs-on-when-using-join) (sí, eso implica el viaje en el tiempo, pero a un vistazo tiene respuestas ligeramente mejores) –

Respuesta

17

Si el optimizador de consultas hace su trabajo, no hay ninguna diferencia (excepto la claridad para los demás) en las dos formas para las combinaciones internas.

Dicho esto, con la izquierda se une una condición en la unión significa filtrar filas de la segunda tabla antes de unirse. Una condición en el where significa filtrar filas del resultado final después de unirse. Esos significan cosas muy diferentes.

+4

+1. para señalar la diferencia –

+0

+1 Analizador de SQL informa exactamente el mismo número de lecturas – kelloti

0

creo que esto es lo que busca >>SQL join: where clause vs. on clause

+0

Si cree que la pregunta es un duplicado, simplemente márquelo como uno, en lugar de agregar una respuesta de solo enlace que no proporcione contenido propio. –

0

No hay ninguna diferencia entre estos dos, porque en el procesamiento lógico de la consulta, WHERE siempre irá a la derecha después de la cláusula de filtro (ON), en los ejemplos que tendrá:

  1. producto cartesiano (número de filas de la Tabla a x número de filas de la Tabla B)
  2. filtro (eN)
  3. Dónde.

Sus ejemplos son en el estándar ANSI SQL-92, también se puede escribir la consulta con el estándar ANSI SQL-89 así:

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

esto es cierto para combinaciones internas, CON combinaciones externas SE SIMILAR PERO NO EL MISMO

0

Con uniones internas tendrá los mismos resultados y probablemente el mismo rendimiento. Sin embargo, con las combinaciones externas, las dos consultas arrojarían resultados diferentes y no son equivalentes puesto que poner la condición en la cláusula where cambiará la consulta de una combinación izquierda a una combinación interna (a menos que esté buscando los registros donde algunos el campo es nulo).