Comprender la interacción de Inner and Outer se une en SQL
consultas SQL complejas con frecuencia emplean múltiples operaciones de unión, combinando diferentes tipos de unión. Una consideración clave es cómo la inclusión de valores nulos, una característica de las uniones externas, se ve afectada cuando se aplica posteriormente una unión interna.
cómo las uniones internas pueden afectar los resultados de la unión externa
una unión interna, por su naturaleza, solo devuelve filas donde se cumple la condición de unión en ambas tablas . Si una unión interna sigue una unión externa, y la condición de la unión interna se basa en columnas que podrían ser nulas (debido a la unión externa), filtra efectivamente filas donde esas columnas son nulas. Esto niega la inclusión de valores nulos que la unión externa proporcionó inicialmente.
ejemplo ilustrativo
examinemos un escenario:
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
INNER JOIN email ON person.email_id = email.id;
la izquierda unirse
asegura que todas las filas de la tabla persona
están incluidas, incluso si no hay entrada coincidente en dirección
. Sin embargo, el interno se une
con correo electrónico
luego restringe los resultados solo a aquellas filas donde un correo electrónico de coincidencia email_id
existe en ambos persona
y correo electrónico
. Filas de persona
que tuvo una dirección de coincidencia dirección
pero un nulo email_id
se excluirá.
un escenario problemático y su solución
Considere esta consulta:
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
INNER JOIN city ON address.city_id = city.id;
aquí, el interno Join
con city
asume que dirección.city_id
nunca es nulo. Si algunas direcciones carecen de city_id
, esas filas (y asociadas persona
se omitirán, alterando involuntariamente los resultados de la inicial izquierda unirse
.
El enfoque correcto es usar otro izquierda Join
en lugar del Inner Join
:
SELECT *
FROM person
LEFT JOIN address ON person.address_id = address.id
LEFT JOIN city ON address.city_id = city.id;
Esto conserva la inclusión de la inicial izquierda unión
, manejando correctamente los casos donde direcciones.city_id
podría ser nulo. Esto asegura que todos los registros de personas persona
estén incluidos, independientemente de si tienen una dirección o una ciudad asociada con ellos.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3