Welcome to Our Website

SQL Tip: Left JOINs and WHERE clauses?are they really LEFT JOINs?

X

Privacidad & Cookies

Este sitio utiliza cookies. Al continuar, usted acepta su uso. Obtenga más información, incluido cómo controlar las cookies.

¡lo tengo!,

Anuncios

Hay veces cuando hago una revisión de consultas SQL y encontrar personas con IZQUIERDA Combinaciones EXTERNAS, pero, a continuación, utilizar las cláusulas where de que gire las combinaciones en el centro de la Une. Recientemente, cuando mencioné esto a alguien, me recordaron que debería bloguear sobre it…so aquí estoy blogueando sobre ello. 🙂

En primer lugar, si usted no está familiarizado con los diferentes JOINs seguir adelante y leer este otro consejo SQL que escribí., Ahora, vamos a aprender un poco más sobre la unión externa izquierda (me referiré a ella simplemente como la Unión izquierda de aquí en adelante).

comencemos con algunos datos de muestra. Lo siguiente se puede usar al principio de sus propias consultas Si va a ejecutar estas pruebas por sí mismo. Como puede ver, crea dos tablas (variables de tabla).,

Si queremos devolver todos los registros en «Tabla1», independientemente de si hay un registro asociado en «Tabla2» y mostrar los datos de «Tabla2» cuando hay asociado un registro que nos gustaría escribir un LEFT JOIN, así:

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID;

Resultado:

sin Embargo, si ahora queremos agregar una cláusula where de la consulta para solo obtener los datos de «Tabla2», donde el IDENTIFICADOR es de menos de 4 podríamos hacer algo como esto:

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID WHERE tb2.columnID < 4;

Resultado:

Pero…¿has visto que sólo obtenemos los valores donde hay una coincidencia de ID en ambas tablas?, Hmmm seems que parece actuar mucho como una unión interior derecho? Eso es porque lo es. ¿No me crees? Eche un vistazo al plan de ejecución después de ejecutar la Unión izquierda con y sin la condición WHERE. Esto es lo que verás:

entonces, ¿cómo podemos evitar esto? Bueno, ya que estás haciendo un JOIN izquierdo para empezar, obviamente necesitas o quieres devolver todos los registros de » Table1 «independientemente de los datos de»Table2″., Y si realmente no desea devolver datos para ciertos registros en» Table2″, puede filtrar esos registros en su predicado de unión (los ‘criterios de búsqueda’ en la parte ON DE LA UNIÓN). Por ejemplo, la última consulta se escribiría de la siguiente manera:

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID AND tb2.columnID < 4;

salida:

vea cómo todavía obtenemos los 5 registros de «Table1» pero no los datos de «Table2» que no cumplían con nuestros criterios? Solo devuelve valores nulos para los datos de esa tabla que no cumplen con los criterios. Bastante impresionante ¿verdad?,

y can podemos mirar el plan de ejecución de nuevo para demostrar que en realidad estamos usando un JOIN izquierdo:

¿Qué pasa cuando en lugar de un valor alguien usa la condición IS NULL en su lugar? Bueno, en ese caso se puede utilizar en la cláusula WHERE.

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID WHERE tb2.columnID IS NULL;

salida:

Y, echemos un vistazo al plan de ejecución de nuevo:

observe que realiza la Unión izquierda y luego filtra los datos para los registros nulos? Eso es lo que queremos hacer y, francamente, es lo que esperaba hacer.

¿Qué pasa si usamos IS NOT NULL en su lugar? Bueno that esa es otra historia., Echaré a perder la sorpresa y solo te diré que hará una unión interior como lo haría con un valor real. Si no me crees, sigue adelante y ejecuta la consulta tú mismo y mira el plan de ejecución.

entonces, ahí lo tienes; así es como un JOIN izquierdo puede o no ser realmente un JOIN izquierdo. Esperemos que esta información le ayude a escribir mejor, o al menos, consultas más informadas.

Anuncios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *