Enquanto a maioria das junções exige uma condição de correspondência específica (a cláusula ON), o CROSS JOIN é diferente. Ele retorna todas as combinações possíveis de linhas das tabelas unidas. Esse resultado é conhecido matematicamente como um Produto Cartesiano.
Um CROSS JOIN produz um conjunto de resultados onde o número de linhas é o resultado da multiplicação do número de linhas na primeira tabela pelo número de linhas na segunda tabela. Nenhuma condição é usada para corresponder às linhas; cada linha na Tabela A simplesmente encontra cada linha na Tabela B.
Visualização:
Tabela A (Cores) Tabela B (Tamanhos)
+-----------+ +-----------+
| cor | | tamanho |
+-----------+ +-----------+
| Vermelho | --\ | Pequeno |
| Azul | ---|------> | Médio |
+-----------+ --/ | Grande |
+-----------+
Resultado (Combinações):
Vermelho, Pequeno
Vermelho, Médio
Vermelho, Grande
Azul, Pequeno
Azul, Médio
Azul, Grande
Se a Tabela A tiver 2 linhas e a Tabela B tiver 3 linhas, o resultado terá 2 x 3 = 6 linhas.
Existem duas formas de escrever um produto cartesiano:
-- Sintaxe explícita
SELECT
table1.column,
table2.column
FROM
table1
CROSS JOIN
table2;
-- Sintaxe implícita com vírgula
SELECT
table1.column,
table2.column
FROM
table1,
table2;
É importante entender que essas formas diferem não apenas em estilo, mas também na prioridade das operações.
JOIN explícito tem prioridade mais alta e é processado junto com os outros JOINs na ordem do texto da consulta.JOINs explícitos.Por isso, misturar vírgula e JOIN explícito dentro do mesmo FROM pode mudar o significado da consulta ou até gerar erro.
Por exemplo, a consulta abaixo é incorreta:
FROM a, b JOIN c ON (a.x = c.y AND b.z = c.t)
Por que isso é um erro:
b JOIN c explícito;a ainda não está no escopo dessa junção;a.x dentro da cláusula ON é inválida.É por isso que o CROSS JOIN explícito geralmente é preferível: não apenas porque parece mais claro, mas porque se integra melhor com os demais JOINs e evita problemas ocultos de precedência.
Aviso: Seja extremamente cuidadoso ao usar
CROSS JOINem tabelas grandes. Unir duas tabelas com 1.000 linhas cada produzirá 1.000.000 de linhas!
Imagine que queiramos criar um relatório ou uma grade que mostre todas as categorias de filmes para cada loja, mesmo que essa loja não tenha filmes nessa categoria no momento.
SELECT
s.store_id,
c.name AS nome_categoria
FROM
store AS s
CROSS JOIN
category AS c;
Isso produz uma lista de todas as categorias para a Loja 1, seguida de todas as categorias para a Loja 2.
O CROSS JOIN é frequentemente usado para gerar grandes conjuntos de permutações para testes ou para construir calendários/agendas onde você precisa ver todos os intervalos de tempo para todos os usuários.
LEFT JOIN, pode ajudar a identificar combinações ausentes em seus dados.ON (sem condição de correspondência).