¿Cuál es la diferencia entre an INNER JOIN
y LEFT SEMI JOIN
?
En el escenario siguiente, ¿por qué obtengo dos resultados diferentes?
El INNER JOIN
conjunto de resultados es mucho mayor. ¿Alguien puede explicarlo? Estoy tratando de obtener los nombres table_1
que solo aparecen en table_2
.
SELECT name
FROM table_1 a
INNER JOIN table_2 b ON a.name=b.name
SELECT name
FROM table_1 a
LEFT SEMI JOIN table_2 b ON (a.name=b.name)
left semi join
debe volviendo más filas que elinner join
.inner join
devolverá datos sólo si hay una coincidencia entre las dos tablas. Elleft join
devolverá datos de la primera tabla sin tener en cuenta si un registro coincidente se encuentra en la segunda tabla.LEFT SEMI JOIN
solo devolverá una fila desde la izquierda, incluso si hay varias coincidencias en la derecha. AnINNER JOIN
devolverá varias filas si hay varias coincidencias a la derecha.Respuestas:
Una
INNER JOIN
puede devolver datos de las columnas de ambas tablas, y se pueden duplicar los valores de los registros de ambos lados tienen más de una coincidencia. ALEFT SEMI JOIN
solo puede devolver columnas de la tabla de la izquierda y produce uno de cada registro de la tabla de la izquierda donde hay una o más coincidencias en la tabla de la derecha (independientemente del número de coincidencias). Es equivalente a (en SQL estándar):SELECT name FROM table_1 a WHERE EXISTS( SELECT * FROM table_2 b WHERE (a.name=b.name))
Si hay varias filas coincidentes en la columna de la derecha, an
INNER JOIN
devolverá una fila por cada coincidencia en la tabla de la derecha, mientras que aLEFT SEMI JOIN
solo devuelve las filas de la tabla de la izquierda, independientemente del número de filas coincidentes en el lado derecho. Es por eso que está viendo un número diferente de filas en su resultado.Entonces a
LEFT SEMI JOIN
es la consulta apropiada para usar.fuente
LEFT SEMI JOIN
? ¿No es solo unSEMI JOIN
? No tiene sentido aRIGHT SEMI JOIN
, ¿verdad?Suponga que hay 2 tablas TableA y TableB con solo 2 columnas (Id, Data) y los siguientes datos:
TablaA:
+----+---------+ | Id | Data | +----+---------+ | 1 | DataA11 | | 1 | DataA12 | | 1 | DataA13 | | 2 | DataA21 | | 3 | DataA31 | +----+---------+
TablaB:
+----+---------+ | Id | Data | +----+---------+ | 1 | DataB11 | | 2 | DataB21 | | 2 | DataB22 | | 2 | DataB23 | | 4 | DataB41 | +----+---------+
La unión interna en la columna
Id
devolverá columnas de ambas tablas y solo de los registros coincidentes:.----.---------.----.---------. | Id | Data | Id | Data | :----+---------+----+---------: | 1 | DataA11 | 1 | DataB11 | :----+---------+----+---------: | 1 | DataA12 | 1 | DataB11 | :----+---------+----+---------: | 1 | DataA13 | 1 | DataB11 | :----+---------+----+---------: | 2 | DataA21 | 2 | DataB21 | :----+---------+----+---------: | 2 | DataA21 | 2 | DataB22 | :----+---------+----+---------: | 2 | DataA21 | 2 | DataB23 | '----'---------'----'---------'
La combinación izquierda (o combinación externa izquierda) en la columna
Id
devolverá columnas de las tablas y registros coincidentes con registros de la tabla izquierda (valores nulos de la tabla derecha):.----.---------.----.---------. | Id | Data | Id | Data | :----+---------+----+---------: | 1 | DataA11 | 1 | DataB11 | :----+---------+----+---------: | 1 | DataA12 | 1 | DataB11 | :----+---------+----+---------: | 1 | DataA13 | 1 | DataB11 | :----+---------+----+---------: | 2 | DataA21 | 2 | DataB21 | :----+---------+----+---------: | 2 | DataA21 | 2 | DataB22 | :----+---------+----+---------: | 2 | DataA21 | 2 | DataB23 | :----+---------+----+---------: | 3 | DataA31 | | | '----'---------'----'---------'
La combinación derecha (o combinación externa derecha) en la columna
Id
devolverá columnas de las tablas y registros coincidentes con registros de la tabla derecha (valores nulos de la tabla izquierda):La unión externa completa en la columna
Id
devolverá columnas de las tablas y registros coincidentes con registros de la tabla izquierda (valores nulos de la tabla derecha) y registros de la tabla derecha (valores nulos de la tabla izquierda):Left Semi Join en la columna
Id
devolverá columnas solo de la tabla izquierda y registros coincidentes solo de la tabla izquierda:fuente
Probé en Hive y obtuve el siguiente resultado
tabla 1
Tabla 2
Unir internamente
Unión a la izquierda
Semi unión izquierda
fuente