SQL Server: ¿Cuál es la diferencia entre CROSS JOIN y FULL OUTER JOIN?


¿Cuál es la diferencia entre la COMBINACIÓN CRUZADA y la COMBINACIÓN EXTERNA COMPLETA en SQL Server?

¿Son iguales o no? Por favor, explíquese. ¿Cuándo se usaría cualquiera de estos?

Author: marc_s, 2010-07-12

10 answers

Una unión cruzada produce un producto cartesiano entre las dos tablas, devolviendo todas las combinaciones posibles de todas las filas. No tiene ninguna cláusula on porque estás uniendo todo a todo.

A full outer join es una combinación de un left outer y right outer join. Devuelve todas las filas en ambas tablas que coinciden con la cláusula where de la consulta, y en los casos en los que la condición on no se puede cumplir para esas filas, coloca valores null para los campos despoblados.

Estowikipedia el artículo explica los diversos tipos de uniones con ejemplos de salida dado un conjunto de tablas de muestra.

 199
Author: Donnie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-12 13:21:14

Una cosa que puede no ser siempre obvia para algunos es que una combinación cruzada con una tabla vacía (o conjunto de resultados) resulta en una tabla vacía (M x N; por lo tanto M x 0 = 0)

Una unión externa completa siempre tendrá filas a menos que M y N sean 0.

 50
Author: user2292493,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-17 20:29:01

Me gustaría añadir un aspecto importante a otras respuestas, que en realidad me explicó este tema de la mejor manera:

Si 2 tablas unidas contienen M y N filas, entonces la unión cruzada siempre producirá (M x N) filas, pero la unión externa completa producirá desde MAX(M,N) hasta (M + N) filas (dependiendo de cuántas filas coincidan realmente con el predicado "on").

EDITAR:

Desde la perspectiva del procesamiento lógico de consultas, la COMBINACIÓN CRUZADA siempre produce M x N filas. ¿Qué sucede con EL EXTERIOR COMPLETO JOIN es que ambas tablas izquierda y derecha se "conservan", como si ambas se unieran a la IZQUIERDA y a la DERECHA. Por lo tanto, las filas, que no satisfacen EL predicado, de las tablas izquierda y derecha se agregan al conjunto de resultados.

 19
Author: Konstantin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-19 07:47:44

Unión cruzada :Las uniones cruzadas producen 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 UNIÓN CRUZADA dará como resultado 6 filas. No hay ninguna relación establecida entre las dos tablas, literalmente solo produce todas las combinaciones posibles.

Unión exterior completa: Una UNIÓN EXTERIOR COMPLETA no es ni "izquierda" ni "derecha" - ¡es ambas cosas! Incluye todas las filas de ambas tablas o conjuntos de resultados que participan en la UNIÓN. Cuando no existen filas coincidentes para las filas en el lado " izquierdo "de la COMBINACIÓN, verá valores nulos del conjunto de resultados en el lado "derecho"."Por el contrario, cuando no existen filas coincidentes para las filas en el lado" derecho "de la COMBINACIÓN, se ven valores nulos del conjunto de resultados en el lado" izquierdo."

 14
Author: KuldipMCA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-12 13:29:28

Para SQL Server, CROSS JOIN and FULL OUTER JOIN son diferentes. CROSS JOIN es simplemente el Producto Cartesiano de dos tablas, independientemente de cualquier criterio de filtro o cualquier condición.

FULL OUTER JOIN da resultado único conjunto de LEFT OUTER JOIN and RIGHT OUTER JOIN de dos tablas. También necesita la cláusula ON para mapear dos columnas de tablas.

La tabla 1 contiene 10 filas y la Tabla 2 contiene 20 filas con 5 filas coincidentes en columnas específicas.

Entonces CROSS JOIN devolverá 10*20=200 filas en el conjunto de resultados.

FULL OUTER JOIN volverá 25 filas en el conjunto de resultados.

FULL OUTER JOIN (o cualquier otra COMBINACIÓN) siempre devuelve un conjunto de resultados con menos o igual a Cartesian Product number.

Número de filas devueltas por FULL OUTER JOIN igual a (No. de las filas por LEFT OUTER JOIN) + (No. of Rows by RIGHT OUTER JOIN) - (No. de las filas por INNER JOIN).

 7
Author: Chirag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-24 12:04:08

Combinación cruzada: http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm

TLDR: Genera todas las combinaciones posibles entre 2 tablas (producto cartesiano)

Unión exterior(completa): http://www.w3schools.com/Sql/sql_join_full.asp

TLDR: Devuelve cada fila en las tablas bot y coincide con los resultados que tienen los mismos valores

 5
Author: Sjuul Janssen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-12 13:24:02

Hi son los mismos conceptos aparte del valor NULL devuelto.

Véase a continuación:

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  t1.col1 = t2.col1

/* RESULT
col1        col2        col1        col2     
----------- ----------- ----------- ----------- 
NULL        NULL        10          101
2           22          2           202
1           11          NULL        NULL

(3 row(s) affected)
*/
select  *
from    @table1 t1 cross join @table2 t2

/* RESULT 
col1        col2        col1        col2        
----------- ----------- ----------- ----------- 
1           11          10          101
2           22          10          101
1           11          2           202
2           22          2           202

(4 row(s) affected)
*/
 3
Author: rio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-19 08:19:09

Unión exterior completa:

Esta unión combina la unión exterior izquierda y la unión exterior derecha. Devuelve fila de cualquier tabla cuando se cumplen las condiciones y devuelve valor nulo cuando no hay coincidencia.

Imagen: ( http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg )

Combinación cruzada:

Esta unión es una unión cartesiana que no requiere ninguna condición para unirse. El conjunto de resultados contiene registros que son la multiplicación del número de registro tabla.

Imagen: ( http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg )

 1
Author: Sujeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-25 06:43:43

Aquí hay un ejemplo donde tanto la UNIÓN EXTERNA COMPLETA como la UNIÓN CRUZADA devuelven el mismo conjunto de resultados sin que se devuelva NULL. Tenga en cuenta el 1 = 1 en la cláusula ON para la UNIÓN EXTERIOR COMPLETA:

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 row(s) affected)

(2 row(s) affected)
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 row(s) affected)
 1
Author: Mo Gauvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-04 20:19:58

SQL FULL OUTER JOIN

  • La UNIÓN EXTERNA COMPLETA 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 tanto de LEFT OUTER JOIN como de RIGHT OUTER JOIN

  • SQL full outer join también se conoce como FULL JOIN

Referencia : http://datasciencemadesimple.com/sql-full-outer-join/

CRUZ SQL 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 de UNIÓN CRUZADA es igual al número de filas en la primera tabla multiplicado por el número de filas en la segunda tabla.

  • La UNIÓN CRUZADA 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/

 0
Author: karaimadai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-09 11:53:25