Gerar um produto cartesiano no sql, nada mais é do que: “Combinar todas as linhas de duas ou mais tabelas”. Não é necessário ter uma relação entre as tabelas envolvidas.
Mas cuidado, se você tiver uma tabela “A” com 20.000 linhas e 40.000 linhas na tabela “B”, você terá 800.000 linhas combinadas, como resultado (já vi algumas pessoas comentarem, que essa é uma boa forma de se gerar uma massa de dados, para teste). Vamos fazer um exemplo simples.
Vamos criar uma tabela temporária de clientes e outra de carros.
CREATE TABLE #Cliente (Id INT PRIMARY KEY IDENTITY(1, 1), Nome VARCHAR(100)); INSERT INTO #Cliente (Nome) VALUES('João'); INSERT INTO #Cliente (Nome) VALUES('Jeremias'); INSERT INTO #Cliente (Nome) VALUES('Maria');
Acima estamos criando e inserindo algumas linhas na tabela temporária “#Cliente”.
CREATE TABLE #Carro (Id INT PRIMARY KEY IDENTITY(1, 1), Nome VARCHAR(100)); INSERT INTO #Carro (Nome) VALUES('Monza'); INSERT INTO #Carro (Nome) VALUES('Corsa'); INSERT INTO #Carro (Nome) VALUES('Voyage');
Acima estamos criando e inserindo algumas linhas na tabela temporária “#Carro”.
Para gerar um produto cartesiano, que combina todos os clientes com todos carros, devemos executar:
SELECT Cliente.Nome, Carro.Nome FROM #Cliente AS Cliente CROSS JOIN #Carro AS Carro
Acima estamos executando um select simples, que tem como particularidade a clausula “CROSS JOIN”, definindo qual tabela deve ser realizado o cruzamento. Você pode usar quando vezes necessitar a clausula “CROSS JOIN”.
Tambem podemos gerar um produto cartesiano dessa forma:
SELECT Cliente.Nome, Carro.Nome FROM #Cliente AS Cliente, #Carro AS Carro;
Acima estamos executando um select que combina os dados da tabela “#Cliente” com a tabela “#Carro”.
Nesse caso, temos o mesmo resultado, mas particularmente prefiro utilizar “CROSS JOIN”, para não haver “enganos”, que cumulam em processamento alto, etc.
Você pode definir algum critério na consulta também
SELECT Cliente.Nome, Carro.Nome FROM #Cliente AS Cliente CROSS JOIN #Carro AS Carro WHERE Carro.Nome = 'Monza';
Acimas geramos um produto cartesiano para todos os clientes, com apenas o carro “Monza”.
Espero ter ajudado!
Até a próxima pessoal!