Unión externa interna y izquierda con cláusula Where vs cláusula ON

Filtrar los resultados con la cláusula [ON] y la cláusula [Where] utilizando LEFT OUTER JOIN y INNER JOIN es una técnica muy poderosa.

Un UNIR INTERNAMENTE da filas que coinciden con los valores en columnas comunes de dos o más tablas usando un operador como (=) igual.

UNA ÚNASE A LA IZQUIERDA o ÚNASE A LA IZQUIERDA da todas las filas de la tabla izquierda con filas coincidentes de ambas tablas. Cuando una fila en la tabla izquierda no tiene filas coincidentes en la tabla derecha, la fila del conjunto de resultados asociado contiene valores nulos para todas las columnas de la lista de selección que provienen de la tabla derecha.

Ahora, vamos a demostrar cómo funcionan estos.

Vamos a crear dos tablas: FRUTA y FRUIT_COLOR.

SI OBJECT_ID ('FRUIT') NO ES NULL DROP TABLE FRUIT; VAYA A CREAR LA TABLA DE FRUTAS (nombre VARCHAR (25), color INT); GO IF OBJECT_ID ('FRUIT_COLOR') NO ES UNA TABLA DE GOTA NULA FRUIT_COLOR; GO CREATE TABLE FRUIT_COLOR (id INT, nombre VARCHAR (25)); IR


Con respecto a la estructura de las tablas creadas, la tabla FRUIT_COLOR tiene una columna (ID) y un color (nombre) únicos.

La tabla FRUIT consiste en frutas (nombre) s y sus respectivos (color).

No he creado ninguna relación entre la clave principal y la clave externa para que sea sencillo, pero puede comprender fácilmente que la clave principal FRUIT_COLOR (ID) es una clave externa a FRUIT (color).

Rellene estas tablas con algunos datos.

INSERTE en FRUIT_COLOR VALUES (1, 'naranja'); INSERTE en FRUIT_COLOR VALUES (2, 'amarillo'); INSERTE en FRUIT_COLOR VALUES (3, 'red'); INSERTE en FRUIT_COLOR VALUES (4, 'blue'); IR INSERTAR EN VALORES FRUTALES ('banana', 2); INSERTAR EN VALORES FRUTALES ('mango', 2); INSERTAR EN VALORES DE FRUTA ('naranja', 1); Insertar en valores de frutas ('manzana', 3); INSERTAR EN VALORES FRUTALES ('uvas', nulo); INSERTAR EN VALORES FRUTALES ('aguacate', nulo); GO SELECT * desde FRUIT; SELECT * desde FRUIT_COLOR; IR

Demostraremos diferentes escenarios con una combinación externa izquierda.

Consulta 1.1 - Una unión externa izquierda simple y simple

SELECT * FROM FRUIT F LEFT join externa FRUIT_COLOR FC ON F.color = FC.id; IR


Como conocemos el concepto de una JUNTA EXTERNA IZQUIERDA, sabemos que mostrará todas las filas de la tabla de la izquierda. En este caso, FRUIT es la tabla de la izquierda, y si se encuentra alguna coincidencia con la tabla de la derecha llamada FRUIT_COLOR, mostrará las filas correspondientes. De lo contrario, devolverá NULL.

En el ejemplo anterior, las uvas y los aguacates tienen su color como NULL, por lo que la comparación NULL falla y devuelve NULL.

Consulta 1.2 - Una unión externa izquierda con la cláusula Where

SELECCIONAR * DE FRUIT F IZQUIERDA combinación externa FRUIT_COLOR FC EN F.color = FC.id DONDE F.name = 'apple'; IR


Cuando agregamos una cláusula where con una combinación externa izquierda, se comporta como una combinación interna, donde el filtro se aplica después de la cláusula ON, mostrando solo aquellas filas que tienen fruto con el nombre de "manzana".

Consulta 1.3 - Una unión externa izquierda con la cláusula ON

SELECT * from FRUIT F LEFT join externa FRUIT_COLOR FC ON F.color = FC.id AND F.name = 'apple'; IR


En la consulta anterior, la mayoría de las personas se confunden acerca de cómo se evalúa esta consulta. Puede ver que los resultados debajo de todas las filas de la tabla izquierda se incluyen en el conjunto de resultados como una consulta de combinación externa izquierda simple que vimos en la Consulta 1.1, pero de la segunda tabla (es decir, fruit_color), solo se muestran aquellas filas que coincide con la condición f.name = 'apple'. De lo contrario, se muestra como NULL.

Esto es útil cuando se filtran datos con una combinación externa izquierda. La cláusula [ON] puede ser útil cuando necesitamos devolver todas las filas de la tabla izquierda y solo aquellas filas de la tabla derecha que coincidan con la condición de la cláusula On.


- Consulta 1.4 - Una unión interna con la cláusula Where

SELECCIONAR * DE FRUIT F INNER unirse a FRUIT_COLOR FC EN F.color = FC.id DONDE F.name = 'orange'; IR


- Consulta 1.5 - Una unión interna con la cláusula ON

SELECCIONE * DESDE FRUIT F INNER únase a FRUIT_COLOR FC EN F.color = FC.id Y F.name = 'orange'; IR


Puede ver tanto la consulta 1.4 como la consulta 1.5, utilizando una combinación interna, devuelva el mismo resultado porque no importa dónde filtre las filas con una combinación interna. Con la cláusula on o la cláusula where, ambos casos le darán los mismos resultados.