¿Cuál es la diferencia entre an INNER JOINy LEFT SEMI JOIN?
En el escenario siguiente, ¿por qué obtengo dos resultados diferentes?
El INNER JOINconjunto de resultados es mucho mayor. ¿Alguien puede explicarlo? Estoy tratando de obtener los nombres table_1que 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 joindebe volviendo más filas que elinner join.inner joindevolverá datos sólo si hay una coincidencia entre las dos tablas. Elleft joindevolverá datos de la primera tabla sin tener en cuenta si un registro coincidente se encuentra en la segunda tabla.LEFT SEMI JOINsolo devolverá una fila desde la izquierda, incluso si hay varias coincidencias en la derecha. AnINNER JOINdevolverá varias filas si hay varias coincidencias a la derecha.Respuestas:
Una
INNER JOINpuede 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 JOINsolo 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 JOINdevolverá una fila por cada coincidencia en la tabla de la derecha, mientras que aLEFT SEMI JOINsolo 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 JOINes 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
Iddevolverá 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
Iddevolverá 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
Iddevolverá 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
Iddevolverá 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
Iddevolverá 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