Database
 sql >> Base de Dados >  >> RDS >> Database

SQL Cross Join


Este artigo fornece uma visão geral do CROSS JOIN em SQL, bem como alguns exemplos básicos.

O SQL CROSS JOIN (ou FULL OUTER JOIN ) retorna linhas que combinam cada linha da primeira tabela com cada linha da segunda tabela.

Em outras palavras, ele retorna o produto cartesiano das linhas das tabelas na junção.

Sintaxe


Você especifica uma junção cruzada no FROM cláusula.

A sintaxe fica assim:
SELECT *
FROM Table1 CROSS JOIN Table2 
ON Table1.Column = Table2.Column;

Exemplo 1


Aqui está um exemplo para demonstrar.

Dados de amostra


Primeiro, aqui estão as tabelas que usaremos para o exemplo.

O t1 tabela:
+--------+
| col1   |
|--------|
| a      |
| b      |
| c      |
+--------+

O t2 tabela:
+--------+
| col1   |
|--------|
| 1      |
| 2      |
| 3      |
+--------+

A consulta de junção cruzada


Aqui está um exemplo de execução de uma junção cruzada nessas duas tabelas.
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)

Portanto, nossa consulta retorna 9 linhas, embora haja apenas 3 linhas em cada tabela.

Isso se deve ao modo como a junção cruzada funciona. O número de linhas retornado é o número de linhas na tabela à esquerda, multiplicado pelo número de linhas na tabela à direita.

Veja como ele itera pela tabela à esquerda, gerando cada linha na tabela à direita para cada linha na tabela à esquerda.

Isso tem o mesmo efeito que fazer o seguinte:
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)

Exemplo 2


Veja o que acontece se adicionarmos um WHERE cláusula para nossa junção cruzada.
SELECT * FROM t1 
CROSS JOIN t2
WHERE t1.col1 = 'a';

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

Exemplo 3


Suponha que temos as seguintes tabelas.

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

Os Pets tabela:
+---------+-------------+-----------+-----------+------------+
| 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)

Nesse caso, o Pets.PetTypeId coluna é uma chave estrangeira do PetTypes.PetTypeId coluna.

Agora, aqui está um exemplo de execução de uma junção cruzada nessas duas tabelas, mas usando um 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)

Adicionando o WHERE cláusula para a junção cruzada transformou-a em uma junção interna.

Veja o que acontece se removermos o 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)

Obtemos uma junção cruzada que retorna 32 linhas.