UNIÓN CRUZADA vs UNIÓN INTERNA en SQL Server 2008


¿Cuál es la diferencia entre CROSS JOIN y INNER JOIN?

COMBINACIÓN CRUZADA:

SELECT 
    Movies.CustomerID, Movies.Movie, Customers.Age, 
    Customers.Gender, Customers.[Education Level], 
    Customers.[Internet Connection], Customers.[Marital Status], 
FROM   
    Customers 
CROSS JOIN 
    Movies

UNIÓN INTERIOR:

SELECT 
    Movies.CustomerID, Movies.Movie, Customers.Age, 
    Customers.Gender, Customers.[Education Level], 
    Customers.[Internet Connection], Customers.[Marital Status]
FROM   
    Customers 
INNER JOIN 
    Movies ON Customers.CustomerID = Movies.CustomerID

¿Cuál es mejor y por qué usaría cualquiera de los dos?

Author: Steven, 2013-07-20

10 answers

Cross join no combina las filas, si tiene 100 filas en cada tabla con 1 a 1 coincidencia, obtiene 10.000 resultados, Innerjoin solo devolverá 100 filas en la misma situación.

Estos 2 ejemplos devolverán el mismo resultado:

Cruz join

select * from table1 cross join table2 where table1.id = table2.fk_id

Unión interior

select * from table1 join table2 on table1.id = table2.fk_id

Utilice el último método

 100
Author: t-clausen.dk,
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-07-20 07:16:00

Aquí está el mejor ejemplo de Unión Cruzada y Unión Interior.

Considere las siguientes tablas

CUADRO : Teacher

x------------------------x
| TchrId   | TeacherName | 
x----------|-------------x
|    T1    |    Mary     |
|    T2    |    Jim      |
x------------------------x

CUADRO : Student

x--------------------------------------x
|  StudId  |    TchrId   | StudentName | 
x----------|-------------|-------------x            
|    S1    |     T1      |    Vineeth  |
|    S2    |     T1      |    Unni     |
x--------------------------------------x

1. UNIÓN INTERIOR

Inner join selecciona las filas que satisfacen tanto la tabla.

Considere que necesitamos encontrar a los maestros que son maestros de clase y sus estudiantes correspondientes. En esa condición, necesitamos aplicar JOIN o INNER JOIN y se

introduzca la descripción de la imagen aquí

Consulta

SELECT T.TchrId,T.TeacherName,S.StudentName 
FROM #Teacher T
INNER JOIN #Student S ON T.TchrId = S.TchrId

Resultado

x--------------------------------------x
|  TchrId  | TeacherName | StudentName | 
x----------|-------------|-------------x            
|    T1    |     Mary    |    Vineeth  |
|    T1    |     Mary    |    Unni     |
x--------------------------------------x

2. CROSS JOIN

Cross join selecciona todas las filas de la primera tabla y todas las filas de la segunda tabla y se muestra como producto cartesiano ie, con todas las posibilidades

Considere que necesitamos encontrar a todos los maestros en la escuela y los estudiantes, independientemente de los maestros de clase, necesitamos aplicar CROSS JOIN.

introduzca la descripción de la imagen aquí

Consulta

SELECT T.TchrId,T.TeacherName,S.StudentName 
FROM #Teacher T
CROSS JOIN #Student S 

Resultado

x--------------------------------------x
|  TchrId  | TeacherName | StudentName | 
x----------|-------------|-------------x            
|    T2    |     Jim     |    Vineeth  |
|    T2    |     Jim     |    Unni     |
|    T1    |     Mary    |    Vineeth  |
|    T1    |     Mary    |    Unni     |
x--------------------------------------x
 155
Author: Sarath Avanavu,
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-08-29 12:52:39

CROSS JOIN = (INTERIOR) JOIN = coma (",")

TL;DR La única diferencia entre SQL CROSS JOIN, (INNER) JOIN y coma (",") (además de la coma que tiene menor precedencia para el orden de evaluación) es que (INNER) JOIN tiene un ON mientras que CROSS JOIN y coma no.


Re productos intermedios

Los tres producen un producto intermedio "cartesiano" "cruzado" relacional de estilo SQL conceptual de todas las combinaciones posibles de una fila de cada tabla. Es EN y / o DONDE reducir el número de filas. SQL Fiddle

El estándar SQL define a través de product (7.5 1.b. ii), via (7.7 1.a) y UNIRSE EN a través de más DONDE (7.7 1.b).

Como Wikipedia lo pone:

Cross join

CROSS JOIN devuelve el producto cartesiano de las filas de las tablas de la combinación. En otras palabras, producirá filas que combinan cada fila de la primera tabla con cada fila de la segunda tabla.

Interior join

[...] El resultado de la unión se puede definir como el resultado de tomar primero el producto cartesiano (o Unión cruzada) de todos los registros en las tablas (combinando cada registro en la tabla A con cada registro en la tabla B) y luego devolver todos los registros que satisfacen el predicado de unión.

La "notación de unión implícita" simplemente enumera las tablas para unir, en la cláusula FROM de la instrucción SELECT, usando comas para separarlos. Por lo tanto, especifica una unión cruzada

Re OUTERJOINs & ON vs WHERE in them see Conditions in LEFT JOIN (OUTER JOIN) vs INNER JOIN.

¿Por qué comparar columnas entre tablas?

Cada tabla contiene las filas que hacen una declaración verdadera de una determinada plantilla de declaración de relleno de espacios en blanco. (Hace una verdadera proposición de { satisface a un cierto predicado(característico) .)

  • Una tabla base contiene las filas que hacen una declaración verdadera de alguna plantilla de declaración dada por DBA:

    /* rows where
    customer C.CustomerID has age C.Age and ...
    */
    FROM Customers C
    
  • El producto intermedio de una combinación contiene las filas que hacen una declaración verdadera a partir de las plantillas Y de sus operandos:

    /* rows where
        customer C.CustomerID has age C.Age and ...
    AND movie M.Movie is rented by customer M.CustomerID and ...
    */
    FROM Customers C CROSS JOIN Movies M
    
  • ON & WHERE conditions are ANDed in to give a further template. El valor es de nuevo las filas que satisfacen que plantilla:

    /* rows where
        customer C.CustomerID has age C.Age and ...
    AND movie M.Movie is rented by customer M.CustomerID and ...
    AND C.CustomerID = M.CustomerID
    AND C.Age >= M.[Minimum Age]
    AND C.Age = 18
    */
    FROM Customers C CROSS JOIN Movies M
    ON C.CustomerID = M.CustomerID
    AND C.Age >= M.[Minimum Age]
    WHERE C.Age = 18
    

En particular, comparar columnas para la igualdad entre tablas significa que las filas mantenidas del producto de las partes de las tablas unidas de la plantilla tienen el mismo valor para esas columnas. Es solo una coincidencia que muchas filas se eliminen típicamente por comparaciones de igualdad entre tablas what lo que es necesario y suficiente es caracterizar las filas que desea.

Simplemente escriba SQL para la plantilla para las filas que desee!

Re el significado de consultas (y tablas vs condiciones) ver:
¿Cómo obtener datos coincidentes de otra tabla SQL para dos columnas diferentes: Unión interna y/o Unión?
¿Hay alguna regla de oro para construir una consulta SQL a partir de una descripción legible por humanos?

Sobrecarga de "unión cruzada"

Desafortunadamente el término "unión cruzada" se usa para:

  • El producto intermedio.
  • CROSS JOIN.
  • (INTERIOR) UNIRSE con un ON o DONDE eso no compare cualquier columna de una tabla con cualquier columna de otra. (Ya que tiende a devolver tantas de las filas de productos intermedios.)

Usando CROSS JOIN vs (INTERIOR) JOIN vs coma

La convención común es:

  • Use CROSS JOIN cuando y solo cuando no compare columnas entre tablas. Esto es para demostrar que la falta de comparaciones fue intencional.
  • Use (INNER) JOIN with ON cuando y solo cuando compare columnas entre tablas (Más posiblemente otras condiciones.)
  • No use coma.

Típicamente también las condiciones no en pares de tablas se mantienen para un DONDE. Pero pueden tener que ser puestos en un(n INTERNO) JOIN ON para obtener filas apropiadas para el argumento a una DERECHA, IZQUIERDA o COMPLETA (EXTERIOR) JOIN.

Estos diversos significados se confunden. (Por ejemplo, como en otras respuestas y comentarios aquí.)

Re"Don't use comma" Mezclar la coma con la COMBINACIÓN explícita puede inducir a error porque la coma tiene menor precedencia. Pero dado el papel del producto intermedio en el significado de UNIÓN CRUZADA, UNIÓN (INTERNA) y coma, los argumentos a favor de la convención anterior de no usarlo en absoluto son dudosos. Una UNIÓN CRUZADA o coma es como una UNIÓN (INTERNA) que está EN una condición VERDADERA. Un producto intermedio, EN y DONDE todos introducen un Y en el predicado correspondiente. Sin embargo, se puede pensar en la UNIÓN INTERNA say digamos, generar una fila de salida solo cuando se encuentra un par de filas de entrada que satisfaga la condición ON it it sin embargo, devuelve las filas de unión cruzada que satisfacen la condición. La única razón POR LA que teníapara complementar la coma en SQL era escribir uniones EXTERNAS. Por supuesto, una expresión debe dejar claro su significado; pero lo que está claro depende de lo que las cosas se toman para significar.

Re Venn diagrams Un diagrama Venn con dos círculos que se cruzan puede ilustrar la diferencia entre filas de salida para UNIONES INTERNAS, IZQUIERDAS, DERECHAS y COMPLETAS para la misma entrada. Y cuando el ON es incondicionalmente CIERTO, el resultado de la UNIÓN INTERNA es el mismo que la UNIÓN CRUZADA. También puede ilustrar las filas input & output para INTERSECT, UNION & EXCEPT. Y cuando ambas entradas tienen las mismas columnas, el resultado de la INTERSECCIÓN es el mismo que el estándar SQL NATURAL JOIN. Pero sí no ilustra cómo funciona la UNIÓN (INTERNA) en general. Eso solo parece plausible a primera vista. Se puede identificar algunas partes de entrada y/o salida para casos especiales de ON, PKs (claves primarias), FKs (claves foráneas) y/o SELECT. Todo lo que tienes que hacer para ver esto es identificar cuáles son exactamente las restricciones y cuáles son exactamente los elementos de los conjuntos representados por los círculos. (Que en esos casos especiales re partes nunca se deja claro.) (Recuerde que en general las filas de salida tienen encabezados diferentes de las filas de entrada.)

 47
Author: philipxy,
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
2018-10-03 10:42:04

Unión interior

La unión que muestra solo las filas que tienen una coincidencia en ambas tablas unidas se conoce como unión interna. Esta es la combinación predeterminada en el diseñador de consultas y vistas.

Sintaxis para la unión interna

SELECT t1.column_name,t2.column_name
FROM table_name1 t1
INNER JOIN table_name2 t2
ON t1.column_name=t2.column_name

Cruz Join

Una unión cruzada que produce un producto cartesiano de las tablas que participan en la unión. El tamaño de un producto Cartesiano es el número de filas de la primera tabla multiplicado por el número de filas de la segunda tabla.

Sintaxis para Unión cruzada

SELECT * FROM table_name1
CROSS JOIN table_name2

O podemos escribirlo de otra manera también

SELECT * FROM table_name1,table_name2

Ahora compruebe la consulta de abajo para Cross join

Ejemplo

SELECT * FROM UserDetails
CROSS JOIN OrderDetails

O

SELECT * FROM UserDetails, OrderDetails
 22
Author: kavitha Reddy,
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-06-11 23:08:08

Por favor recuerde, si se agrega una cláusula WHERE, la unión cruzada se comporta como una unión interior. Por ejemplo, las siguientes consultas Transact-SQL producen el mismo conjunto de resultados. Por favor, consulte http://technet.microsoft.com/en-us/library/ms190690(v=sql.105).aspx

 10
Author: user3095896,
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-03-12 13:51:01

SQL Server también acepta la notación más simple de:

SELECT A.F, 
       B.G, 
       C.H 
  FROM TABLE_A A, 
       TABLE_B B, 
       TABLE_C C
 WHERE A.X = B.X 
   AND B.Y = C.Y

Usando esta notación más simple, uno no necesita preocuparse por la diferencia entre uniones internas y cruzadas. En lugar de dos cláusulas" ON", hay una única cláusula" WHERE " que hace el trabajo. Si tiene alguna dificultad para averiguar qué cláusulas "JOIN "" ON "van a dónde, abandone la notación" JOIN " y use la más simple de arriba.

No es hacer trampa.

 6
Author: David F Mayer,
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-08-26 16:24:53

Al escribir consultas usando uniones internas, los registros obtendrán de ambas tablas si la condición se cumple en ambas tablas, es decir, la coincidencia exacta de la columna común en ambas tablas.

Al escribir la consulta usando cross join el resultado es como el producto cartesiano del no de registros en ambas tablas. ejemplo si tabla1 contiene 2 registros y tabla2 contiene 3 registros, el resultado de la consulta es 2 * 3 = 6 registros.

Así que no vayas por cross join hasta que lo necesites.

 2
Author: Jagadeesh G,
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-07-21 04:58:48

Cross join y inner join son lo mismo con la única diferencia de que en inner join filtramos booleanamente algunos de los resultados del producto cartesiano

table1
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    option1  |
|    A     |      B1     |    option2  |
x--------------------------------------x

table2
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    optionB1 |
|    A1    |      B1     |    optionB2 |
x--------------------------------------x

 cross join
  A,B,option1,A,B,optionB1
  A,B,option1,A1,B1,optionB2
  A,B1,option2,A,B,optionB1
  A,B1,option2,A1,B1,optionB2

 inner join on field1 (only with the value is the same in both tables)
  A,B,option1,A,B,optionB1
  A,B1,option2,A,B,optionB1

 inner join on field1
  A,B,option1,A,B,optionB1

Es en el diseño de nuestros datos donde decidimos que solo hay un caso del campo que estamos utilizando para la unión. Unir solo cruce unir ambas tablas y obtener solo las líneas logrando una expresión booleana especial.

Tenga en cuenta que si los campos en los que estamos haciendo nuestras uniones serían nulos en ambas tablas, pasaríamos filtro. Depende de nosotros o del fabricante de la base de datos agregar reglas adicionales para evitar o permitir nulos. Adhiriéndose a los conceptos básicos, es solo una unión cruzada seguida de un filtro.

 2
Author: Javier Bañez,
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
2016-02-05 11:23:26

La unión interna dará el resultado de los registros coincidentes entre dos tablas donde como la unión cruzada le da las posibles combinaciones entre dos tablas.

 0
Author: sindhu,
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
2016-02-04 16:58:35

La COMBINACIÓN CRUZADA SQL produce un conjunto de resultados que es el número de filas en la primera tabla multiplicado por el número de filas en la segunda tabla si no se usa ninguna cláusula WHERE junto con la COMBINACIÓN CRUZADA.Este tipo de resultado se llama Producto Cartesiano.

Si la cláusula WHERE se usa con CROSS JOIN, funciona como una UNIÓN INTERNA.

 0
Author: shahadul,
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
2018-06-05 08:05:18