2011-09-09 22 views
7

podemos obtener el mismo resultado en ambas formas ..¿Qué es mejor ... unión externa izquierda o unión externa derecha?

Table_1 LEFT OUTER JOIN Table_2 

Table_2 RIGHT OUTER JOIN Table_1 

Si podemos conseguir el mismo resultado por qué utilizar combinación externa derecha? Cuál es mejor ?

+7

Para sumar 'a' y' b', puede hacer 'a + b' o' b + a'. ¿Cuál es mejor? –

+0

Creo que un RDBMS moderno puede transformar uno a otro y elegir uno que tenga un mejor rendimiento, por lo que no debería importar. –

Respuesta

13

Como otros han señalado ya LEFT OUTER JOIN y RIGHT OUTER JOIN son exactamente la misma operación, excepto con sus argumentos invertidos. Su pregunta es como preguntar si es mejor escribir a < b o b > a. Son lo mismo, es solo una cuestión de preferencia.

Habiendo dicho eso, me parece que la mayoría de la gente está más familiarizada con LEFT JOIN y la usa consistentemente en su SQL. Algunas personas incluso les resulta bastante difícil leer si de repente hay un RIGHT JOIN en medio de una consulta, y esto les obliga a detenerse y pensar lo que significa. Por lo tanto, sugeriría que si se les da una opción igual entre las dos opciones, prefieran usar LEFT JOIN. Ser consistente facilitará que otros desarrolladores comprendan su SQL.

+3

Ese es un mejor ejemplo que el mío en los comentarios. Por alguna razón, estaba dibujando un espacio en blanco en un operador simple que no era simétrico :-) –

+4

Sí. Creo que la preferencia por IZQUIERDA probablemente proviene de la inclinación natural a comenzar a escribir una consulta con las tablas más "importantes", que a menudo contienen información completa, es decir, no tienen filas faltantes, y agregan tablas que pueden contener o no información relacionada a ese. –

4

Esos son iguales, solo una cuestión de preferencia y legibilidad. Supongo que es las mismas tablas?

+5

+1 y le sugiero que solo elija una preferencia y se quede con ella. El resultado final debería ser el mismo si eres consistente en tus uniones externas. También te sugiero que utilices combinaciones externas izquierdas si estás indeciso, simplemente porque la mayoría lo hace. – Dane

1

Depende de nuestra necesidad, ya sea que necesitemos todas las columnas de la tabla izquierda o derecha.

Ambos no son lo mismo.

+4

en ambas consultas obtenemos todas las filas de la Tabla_1 ... es decir, el mismo resultado ... Por cierto debería ser ... "si" :) – Vaibhav

2

combinación externa izquierda

El resultado de una combinación externa izquierda (o simplemente unirse a la izquierda) de la tabla A y B siempre contiene todos los registros de la tabla "izquierda" (A), incluso si el join- condición no encuentra ningún registro coincidente en la tabla "derecha" (B). Esto significa que si la cláusula ON coincide con 0 (cero) registros en B, la unión aún devolverá una fila en el resultado, pero con NULL en cada columna de B. Esto significa que una combinación externa izquierda devuelve todos los valores del la izquierda mesa, más los valores de la tabla derecha emparejado (o NULL en caso de no coincidencia de unirse a predicado)

derecho combinación externa

un derecho combinación externa (o derecha unirse a) se parece mucho a una combinación externa izquierda , excepto con el tratamiento de las tablas invertidas. Cada fila de la tabla "derecha" (B) aparecerá en la tabla unida al menos una vez. Si no existe una fila coincidente de la tabla "izquierda" (A), NULL aparecerá en columnas de A para aquellos registros que no coinciden en B. Una combinación externa derecha devuelve todos los valores de la tabla correcta y valores coincidentes de la tabla izquierda (NULL en caso de que no coincida el predicado de unión).

http://en.wikipedia.org/wiki/Join_%28SQL%29

+2

Sí, pero creo que la pregunta que hace el OP es si A LEFT OUTER JOIN B es lo mismo que B RIGHT OUTER JOIN A (tenga en cuenta que las * tablas * se intercambian, así como la dirección de unión.) –

+0

Solo quería escribir cómo funcionan porque entonces uno puede entender que no son diferentes si uno los usa como en el pregunta y es información más útil. –

+0

Gracias @ reader_1000 Estaba detrás de esta explicación :) – Jen

2

Los diseñadores del lenguaje SQL con razón sintieron que la aplicación de izquierda a derecha precedencia de combinaciones sería una restricción innecesaria en el idioma (por desgracia, no se sentían lo mismo de ordenación columna!)

No hace parece para ser una fuerte preferencia por LEFT OUTER aquí en Stackoverflow, en la medida en que la gente cambie la unión completa solo para poder usar LEFT (tuvimos uno here ayer).

Digamos que escribió originalmente en su consulta Table_2 INNER JOIN Table_1 antes de darse cuenta de que realmente necesita una unión externa que preserve todas las filas de Table_1. Sería mucho más simple cambiar INNER a RIGHT OUTER que cambiar la unión completa para poder usar LEFT OUTER. Lo simple es bueno aquí porque es menos invasivo y, por lo tanto, hay menos riesgo de que la intención de la consulta se modifique inadvertidamente.

Para utilizar otro ejemplo similar, considere el operador relacional semi join; Al ser parte del álgebra relacional, no se puede considerar que una tecnología esté completa sin ella. Aunque Standard SQL tiene un predicado de semi unión MATCH, no se implementa ampliamente. Sin embargo, la mayoría de los productos SQL admiten varias soluciones. El enfoque más común visto en Stackoverflow parece ser usar INNER JOIN con DISTINCT en la cláusula SELECT y omitir los atributos de la tabla unida. Esto es seguido de cerca usando WHERE table_1.ID IN (SELECT ID FROM Table_2). Siguiente más popular es WHERE EXISTS (SELECT * FROM Table_2 WHERE table_1.ID = table_1.ID).

El punto es que todo lo anterior son semi uniones que se encuentran muy comúnmente en la naturaleza. Aunque mi preferencia personal es usar EXISTS (aunque, curiosamente, es la que está más cerca del cálculo relacional), aún necesito poder identificar a los demás como semi uniones; curiosamente, el enfoque más popular (INNER JOIN más DISTINCT más no proyección) puede ser el más difícil de identificar.

El código de refacturación con el único propósito de ajustarse al estilo personal está correctamente mal visto: costo de esfuerzo innecesario, aumento de riesgo, implicación para el control de fuente, etc. Aprender a reconocer y respetar las preferencias de los demás es una habilidad importante. refaccionándose una vez solo para poder entenderlo, se pondrá en desventaja.

Por supuesto, en términos relacionales, la respuesta "correcta" es evitar por completo las uniones externas. No existe tal cosa como nulo en el modelo relacional y las combinaciones externas están expresamente diseñadas para producir nulos.

Cuestiones relacionadas