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”.

produtoCartesiano1

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!