sql >> Base de Datos >  >> RDS >> Database

Combinación cruzada de SQL

Este artículo proporciona una descripción general de CROSS JOIN en SQL, así como algunos ejemplos básicos.

El SQL CROSS JOIN (o FULL OUTER JOIN ) devuelve filas que combinan cada fila de la primera tabla con cada fila de la segunda tabla.

En otras palabras, devuelve el producto cartesiano de filas de tablas en la combinación.

Sintaxis

Usted especifica una unión cruzada en el FROM cláusula.

La sintaxis es así:

SELECT *
FROM Table1 CROSS JOIN Table2 
ON Table1.Column = Table2.Column;

Ejemplo 1

Aquí hay un ejemplo para demostrarlo.

Datos de muestra

Primero, aquí están las tablas que usaremos para el ejemplo.

El t1 tabla:

+--------+
| col1   |
|--------|
| a      |
| b      |
| c      |
+--------+

El t2 tabla:

+--------+
| col1   |
|--------|
| 1      |
| 2      |
| 3      |
+--------+

La consulta de unión cruzada

Este es un ejemplo de cómo realizar una unión cruzada en esas dos tablas.

SELECT * FROM t1 
CROSS JOIN t2;

Resultado:

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| b      | 1      |
| c      | 1      |
| a      | 2      |
| b      | 2      |
| c      | 2      |
| a      | 3      |
| b      | 3      |
| c      | 3      |
+--------+--------+
(9 rows affected)

Entonces, nuestra consulta devuelve 9 filas, aunque solo hay 3 filas en cada tabla.

Esto se debe a la forma en que funciona la unión cruzada. El número de filas devuelto es el número de filas de la tabla de la izquierda, multiplicado por el número de filas de la tabla de la derecha.

Vea cómo itera a través de la tabla de la izquierda, generando cada fila de la tabla de la derecha para cada fila de la tabla de la izquierda.

Esto tiene el mismo efecto que hacer lo siguiente:

SELECT * FROM t1, t2

Resultado:

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| b      | 1      |
| c      | 1      |
| a      | 2      |
| b      | 2      |
| c      | 2      |
| a      | 3      |
| b      | 3      |
| c      | 3      |
+--------+--------+
(9 rows affected)

Ejemplo 2

Esto es lo que sucede si agregamos un WHERE cláusula a nuestra unión cruzada.

SELECT * FROM t1 
CROSS JOIN t2
WHERE t1.col1 = 'a';

Resultado:

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| a      | 2      |
| a      | 3      |
+--------+--------+
(3 rows affected)

Ejemplo 3

Supongamos que tenemos las siguientes tablas.

Los PetTypes tabla:

+-------------+-----------+
| PetTypeId   | PetType   |
|-------------+-----------|
| 1           | Bird      |
| 2           | Cat       |
| 3           | Dog       |
| 4           | Rabbit    |
+-------------+-----------+
(4 rows affected)

Las Pets tabla:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+
(8 rows affected)

En este caso, el Pets.PetTypeId la columna es una clave externa de PetTypes.PetTypeId columna.

Ahora, aquí hay un ejemplo de cómo ejecutar una combinación cruzada en esas dos tablas, pero usando un WHERE cláusula.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p 
CROSS JOIN PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId;

Resultado:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+
(8 rows affected)

Agregando el WHERE la cláusula a la combinación cruzada la convirtió en una combinación interna.

Esto es lo que sucede si eliminamos WHERE cláusula.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p 
CROSS JOIN PetTypes pt;

Resultado:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Bird      |
| Fetch     | Bird      |
| Scratch   | Bird      |
| Wag       | Bird      |
| Tweet     | Bird      |
| Fluffy    | Bird      |
| Bark      | Bird      |
| Meow      | Bird      |
| Fluffy    | Cat       |
| Fetch     | Cat       |
| Scratch   | Cat       |
| Wag       | Cat       |
| Tweet     | Cat       |
| Fluffy    | Cat       |
| Bark      | Cat       |
| Meow      | Cat       |
| Fluffy    | Dog       |
| Fetch     | Dog       |
| Scratch   | Dog       |
| Wag       | Dog       |
| Tweet     | Dog       |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Dog       |
| Fluffy    | Rabbit    |
| Fetch     | Rabbit    |
| Scratch   | Rabbit    |
| Wag       | Rabbit    |
| Tweet     | Rabbit    |
| Fluffy    | Rabbit    |
| Bark      | Rabbit    |
| Meow      | Rabbit    |
+-----------+-----------+
(32 rows affected)

Obtenemos una unión cruzada que devuelve 32 filas.