¿Cuál es la diferencia entre CROSS JOIN y FULL OUTER JOIN en SQL Server?
¿Son iguales o no? Por favor explique. ¿Cuándo se usaría alguno de estos?
¿Cuál es la diferencia entre CROSS JOIN y FULL OUTER JOIN en SQL Server?
¿Son iguales o no? Por favor explique. ¿Cuándo se usaría alguno de estos?
Respuestas:
Una unión cruzada produce un producto cartesiano entre las dos tablas, devolviendo todas las combinaciones posibles de todas las filas. No tiene on
cláusula porque solo estás uniendo todo a todo.
A full outer join
es una combinación de a left outer
y right outer
join. Devuelve todas las filas en ambas tablas que coinciden con la where
cláusula de la consulta , y en los casos en on
que no se puede cumplir la condición para esas filas, coloca null
valores para los campos despoblados.
Este artículo de wikipedia explica los diversos tipos de combinaciones con ejemplos de salida dado un conjunto de tablas de muestra.
outer join
más rápido o cross join
?
Una cosa que puede no ser siempre obvia para algunos es que una unión cruzada con una tabla vacía (o conjunto de resultados) da como resultado una tabla vacía (M x N; de ahí que M x 0 = 0)
Una unión externa completa siempre tendrá filas a menos que M y N sean 0.
Me gustaría agregar un aspecto importante a otras respuestas, que realmente me explicaron este tema de la mejor manera:
Si 2 tablas unidas contienen M y N filas, entonces la unión cruzada siempre producirá filas (M x N), pero la unión externa completa producirá desde MAX (M, N) hasta filas (M + N) (dependiendo de cuántas filas realmente coincidencia "en" predicado).
EDITAR:
Desde la perspectiva del procesamiento de consultas lógicas, CROSS JOIN siempre produce M x N filas. Lo que sucede con FULL OUTER JOIN es que las tablas izquierda y derecha están "preservadas", como si hubiera sucedido la unión IZQUIERDA y DERECHA. Entonces, las filas, que no satisfacen el predicado ON, de las tablas izquierda y derecha se agregan al conjunto de resultados.
cross join
multiplica las tablas; a los full outer join
agrega en el peor de los casos, dependiendo de cuántas filas coincidan ..
Cross join: Cross Joins produce resultados que consisten en cada combinación de filas de dos o más tablas. Eso significa que si la tabla A tiene 3 filas y la tabla B tiene 2 filas, una CROSS JOIN dará como resultado 6 filas. No hay una relación establecida entre las dos tablas: literalmente, solo produce todas las combinaciones posibles.
Unión externa completa: UNA UNIÓN COMPLETA EXTERNA no es ni "izquierda" ni "derecha", ¡son ambas cosas! Incluye todas las filas de ambas tablas o conjuntos de resultados que participan en JOIN. Cuando no existen filas coincidentes para las filas en el lado "izquierdo" de JOIN, verá los valores nulos del conjunto de resultados en el "derecho". Por el contrario, cuando no existen filas coincidentes para las filas en el lado "derecho" de JOIN, verá los valores nulos del conjunto de resultados en el "izquierdo".
Para SQL Server, CROSS JOIN and FULL OUTER JOIN
son diferentes.
CROSS JOIN
es simplemente un producto cartesiano de dos tablas, independientemente de cualquier criterio de filtro o condición.
FULL OUTER JOIN
da un conjunto de resultados único LEFT OUTER JOIN and RIGHT OUTER JOIN
de dos tablas. También necesita la cláusula ON para asignar dos columnas de tablas.
La Tabla 1 contiene 10 filas y la Tabla 2 contiene 20 filas con 5 filas que coinciden en columnas específicas.
Luego
CROSS JOIN
devolverá 10 * 20 = 200 filas en el conjunto de resultados.
FULL OUTER JOIN
devolverá 25 filas en el conjunto de resultados.
FULL OUTER JOIN
(o cualquier otro JOIN) siempre devuelve el conjunto de resultados con menos o igual queCartesian Product number
.Número de filas devueltas por
FULL OUTER JOIN
igual a (Número de filas porLEFT OUTER JOIN
) + (Número de filas porRIGHT OUTER JOIN
) - (Número de filas porINNER JOIN
).
Son los mismos conceptos, aparte del valor NULL devuelto.
Vea abajo:
declare @table1 table( col1 int, col2 int );
insert into @table1 select 1, 11 union all select 2, 22;
declare @table2 table ( col1 int, col2 int );
insert into @table2 select 10, 101 union all select 2, 202;
select
t1.*,
t2.*
from @table1 t1
full outer join @table2 t2 on t1.col1 = t2.col1
order by t1.col1, t2.col1;
/* full outer join
col1 col2 col1 col2
----------- ----------- ----------- -----------
NULL NULL 10 101
1 11 NULL NULL
2 22 2 202
*/
select
t1.*,
t2.*
from @table1 t1
cross join @table2 t2
order by t1.col1, t2.col1;
/* cross join
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 2 202
1 11 10 101
2 22 2 202
2 22 10 101
*/
Cross Join : http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm
TLDR; Genera todas las combinaciones posibles entre 2 tablas (producto carthesiano)
(Completo) Unión externa : http://www.w3schools.com/Sql/sql_join_full.asp
TLDR; Devuelve cada fila en ambas tablas y también resultados que tienen los mismos valores (coincidencias en CONDITION)
Una unión externa completa combina una unión externa izquierda y una unión externa derecha. El conjunto de resultados devuelve filas de ambas tablas donde se cumplen las condiciones, pero devuelve columnas nulas donde no hay coincidencia.
Una unión cruzada es un producto cartesiano que no requiere ninguna condición para unir tablas. El conjunto de resultados contiene filas y columnas que son una multiplicación de ambas tablas.
Aquí hay un ejemplo en el que tanto FULL OUTER JOIN como CROSS JOIN devuelven el mismo conjunto de resultados sin NULL devuelto. Tenga en cuenta el 1 = 1 en la cláusula ON para FULL OUTER JOIN:
declare @table1 table ( col1 int, col2 int )
declare @table2 table ( col1 int, col2 int )
insert into @table1 select 1, 11 union all select 2, 22
insert into @table2 select 10, 101 union all select 2, 202
select *
from @table1 t1 full outer join @table2 t2
on 1 = 1
(2 filas afectadas) (2 filas afectadas) col1 col2 col1 col2 ----------- ----------- ----------- ----------- 1 11 10 101 2 22 10 101 1 11 2 202 2 22 2 202
select *
from @table1 t1 cross join @table2 t2
col1 col2 col1 col2 ----------- ----------- ----------- ----------- 1 11 10 101 2 22 10 101 1 11 2 202 2 22 2 202 (4 filas afectadas)
SQL FULL OUTER JOIN
FULL OUTER JOIN devuelve todas las filas de la tabla izquierda (tabla1) y de la tabla derecha (tabla2) independientemente de la coincidencia.
La palabra clave FULL OUTER JOIN combina el resultado de LEFT OUTER JOIN y RIGHT OUTER JOIN
Referencia: http://datasciencemadesimple.com/sql-full-outer-join/
SQL CROSS JOIN
En SQL CROSS JOIN, cada fila de la primera tabla se asigna con todas y cada una de las filas de la segunda tabla.
El número de filas producidas por un conjunto de resultados de la operación CROSS JOIN es igual al número de filas en la primera tabla multiplicado por el número de filas en la segunda tabla.
CROSS JOIN también se conoce como producto cartesiano / unión cartesiana
El número de filas en la tabla A es m, el número de filas en la tabla B es n y la tabla resultante tendrá m * n filas
Referencia: http://datasciencemadesimple.com/sql-cross-join/
FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id
, siempre será más rápido queFROM t1,t2 WHERE t1.id=t2.id
?