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


Respuestas:


243

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

A full outer joines una combinación de a left outery right outerjoin. Devuelve todas las filas en ambas tablas que coinciden con la wherecláusula de la consulta , y en los casos en onque no se puede cumplir la condición para esas filas, coloca nullvalores 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.


Entonces, en caso de tablas grandes FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id , siempre será más rápido que FROM t1,t2 WHERE t1.id=t2.id?
alexkovelsky

Las uniones internas de @alexkovelsky a menudo son más rápidas cuando hay pocas coincidencias entre las dos tablas, ya que el uso de índices significa que no se molesta en leer todas las filas en una de las tablas. una combinación externa completa siempre debe leer todas las filas en ambas tablas (o los índices relevantes). En el caso de que los índices no sean suficientes, o se deba leer un montón subyacente para generar las columnas necesarias, entonces una unión externa completa es casi siempre más lenta que una unión interna.
Andrew Hill

1
¿Es outer joinmás rápido o cross join?
Shafizadeh

2
@ Shafizadeh - Hacen cosas diferentes.
Donnie

9
¿Qué pasa si COMPLETO OUTER JOIN en True? ¿El resultado / rendimiento será similar a CROSS JOIN?
arquitectónico

65

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.


32

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.


2
¿Están esos límites excluyendo posibles 1-muchos partidos? Una unión externa completa todavía es capaz de producir filas (M x N).
maxwellb

1
seleccione COUNT_BIG (*) DESDE Traffic t CROSS JOIN Destinatario r y SELECCIONE COUNT_BIG (*) From Traffic t FULL JOIN Destinatario r ON (1 = 1) son lo mismo.
urlreader

2
La tuya es la mejor respuesta real. Básicamente: a cross joinmultiplica las tablas; a los full outer joinagrega en el peor de los casos, dependiendo de cuántas filas coincidan ..
Brian Peterson

Sí. Estaba buscando esta matemática: producir desde filas MAX (M, N) hasta (M + N) . Gracias.
Arup Rakshit

1
Esto está mal. FULL JOIN ON filas son INNER JOIN ON filas UNION TODAS las filas de la tabla izquierda no coincidentes nulo-extendido UNION TODAS las filas de la tabla derecha no coincidentes nulo-extendido. Por lo tanto, FULL JOIN puede devolver filas M * N, posiblemente mayores que MAX (M, N) y M + N. Pero de todos modos, el número mínimo y máximo de filas devueltas en función de M&N simplemente no es útil . Lo que es útil es una definición clara de FULL JOIN ON, en términos de INNER JOIN ON y filas no coincidentes.
philipxy

15

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".


15

Para SQL Server, CROSS JOIN and FULL OUTER JOINson diferentes. CROSS JOINes simplemente un producto cartesiano de dos tablas, independientemente de cualquier criterio de filtro o condición.

FULL OUTER JOINda un conjunto de resultados único LEFT OUTER JOIN and RIGHT OUTER JOINde 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 JOINdevolverá 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 que Cartesian Product number.

Número de filas devueltas por FULL OUTER JOINigual a (Número de filas por LEFT OUTER JOIN) + (Número de filas por RIGHT OUTER JOIN) - (Número de filas por INNER JOIN).


8

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
*/

1
Excelente ejemplo!
Lucas925

1
Gracias por el ejemplo de datos reales. eso lo hace más claro.
dtc


2

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.


1

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)

1

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

  • La combinación externa completa de SQL también se conoce como FULL 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/

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.