Voltar para a lista de artigos Artigos
7 minutos de leitura

É Possível Juntar Tabelas Sem uma Coluna Comum?

Sim, é possível! Respondendo de forma mais completa, sim, há algumas maneiras de juntar duas tabelas sem uma coluna comum, incluindo CROSS JOIN (produto cartesiano) e UNION. Embora este último não seja tecnicamente um JOIN, ele pode ser útil para unir tabelas em SQL. Neste artigo, vou apresentar diferentes soluções com exemplos.

Quando é Necessário Unir Tabelas sem uma Coluna Comum?

Quem está começando em SQL normalmente é introduzido aos JOINs equi padrão, nos quais duas tabelas são unidas por uma coluna comum. Entretanto, no mundo real, um analista de dados geralmente precisa lidar com tarefas mais diversas e complexas.

Por exemplo, há muitos casos em que é preciso usar JOINs não-equi, quando duas tabelas são unidas usando operadores condicionais que não o sinal de igualdade. Se você não está familiarizado com este tipo de junção, confira nosso curso Cláusulas JOIN em SQL. Ele oferece mais de 90 exercícios práticos em diferentes tipos de JOINs.

Em outros casos, você pode precisar obter todas as combinações entre as linhas das duas tabelas. Se você administra um restaurante, por exemplo, pode precisar ver todas as combinações possíveis entre os vinhos da sua carta de vinhos e os pratos principais do seu cardápio.

Ou então, imagine que as informações sobre seus fornecedores estejam armazenadas em diferentes tabelas. Elas podem até ter nomes de colunas diferentes por tipo de produto (ou seja, vinhos, sucos, frutas, etc.). Talvez você queira combinar todas as informações para gerar uma única tabela com todos os fornecedores.

Nesses casos, você pode precisar juntar duas ou mais tabelas sem precisar de uma coluna comum. Parece uma tarefa bem simples de se resolver usando SQL, e é mesmo! Vou sugerir algumas soluções neste guia.

Antes disso, porém, vamos explorar os dados que usaremos nos nossos exemplos.

Conhecendo os Dados

Somos donos de um restaurante e temos dados relevantes armazenados em várias tabelas, entre as quais estão vinho e prato_principal.

A tabela vinho contém o ID do vinho, o nome do vinho, o ID do fornecedor e o preço:

idnomeid_fornecedorpreco
1Merlot5007.95
2House4002.45
3Sangiovese6005.20

A tabela prato_principal contém, para cada prato, o ID do prato principal, o nome, o ID do fornecedor principal para este prato e o preço:

prato_principal

idnomeid_fornecedor_principalpreco
1Salmão com Cardamomo e Maple Syrup20019.99
2Macarrão com Queijo1008.99
3Frango Teriyaki Assado30011.99
4Filé Mignon ao Molho Gorgonzola40015.99

Vejamos como podemos unir estas tabelas para obter os resultados desejados.

Como Juntar Duas Tabelas Sem uma Coluna Comum

No primeiro exemplo, queremos ver todas as combinações possíveis de vinhos e pratos principais do nosso cardápio. Para isso, existem pelo menos duas abordagens para unir as tabelas vinho e prato_principal gerando o resultado que queremos.

Usando a sintaxe "FROM TABELA1, TABELA2".

Uma maneira de unir duas tabelas sem uma coluna comum é usar uma sintaxe obsoleta para juntar tabelas. Com esta sintaxe, nós simplesmente listamos as tabelas que queremos juntar na cláusula FROM e depois usamos uma cláusula WHERE para adicionar condições de junção, se necessário.

Se o que queremos é cada combinação entre linhas de duas tabelas, não precisamos incluir condições de junção. Podemos usar uma consulta como esta:

SELECT v.nome AS vinho, p.nome AS prato_principal
FROM vinho v, prato_principal p;

A consulta retornará um produto cartesiano (um Cross Join), onde o número total de linhas do conjunto de resultados será igual ao número de linhas da primeira tabela multiplicado pelo número de linhas da segunda tabela.

vinhoprato_principal
MerlotSalmão com Cardamomo e Maple Syrup
HouseSalmão com Cardamomo e Maple Syrup
SangioveseSalmão com Cardamomo e Maple Syrup
MerlotMacarrão com Queijo
HouseMacarrão com Queijo
SangioveseMacarrão com Queijo
MerlotFrango Teriyaki Assado
HouseFrango Teriyaki Assado
SangioveseFrango Teriyaki Assado
MerlotFilé Mignon ao Molho Gorgonzola
HouseFilé Mignon ao Molho Gorgonzola
SangioveseFilé Mignon ao Molho Gorgonzola

Conseguimos o resultado que queríamos. Esta é uma solução viável para unir duas tabelas quando o objetivo é obter um conjunto de resultados com todas as combinações possíveis das linhas. No entanto, esta não é a melhor abordagem.

Os profissionais em SQL preferem usar a palavra-chave CROSS JOIN neste tipo de operação. Ela deixa claro que estamos realizando uma junção cruzada intencionalmente, e não por termos omitido acidentalmente a condição de junção WHERE, o que pode acontecer ao se utilizar a sintaxe obsoleta para juntar tabelas.

Leia mais sobre os benefícios da nova sintaxe para unir tabelas em nosso artigo Qual a Diferença Entre Ter Várias Tabelas com FROM e Usando JOINs

Usando o operador CROSS JOIN

Como você já deve ter imaginado, a segunda abordagem para obter todas as combinações possíveis entre linhas de duas tabelas é usar o operador CROSS JOIN:

SELECT v.nome AS vinho, p.nome AS prato_principal
FROM vinho v
CROSS JOIN prato_principal p;

Esta consulta produz exatamente o mesmo resultado que vimos anteriormente. No entanto, esta sintaxe é preferível, pois indica claramente a intenção de realizar um CROSS JOIN e é mais legível para outros usuários que venham a ler o seu código SQL.

Saiba mais sobre Cross Joins com o nosso Guia Ilustrado de SQL CROSS JOIN.

Usando UNION ou UNION ALL

Há outros casos em que podemos precisar juntar duas tabelas sem uma coluna comum. Como no exemplo anterior, você pode querer compilar todas as informações de fornecedores armazenadas em várias tabelas. Neste caso, você não quer um produto cartesiano. Então, como juntar as tabelas?

Neste caso, você deve usar um UNION para combinar as informações das diferentes tabelas. Tecnicamente, não se trata de uma junção, mas pode ser muito útil para combinar linhas de várias tabelas, como no exemplo abaixo.

Simplificando, JOINs combinam os dados inserindo as colunas de uma tabela ao lado das colunas de outra tabela. Em contraste, UNIONs combinam os dados anexando as linhas ao lado das linhas de outra tabela.

Portanto, se quisermos gerar uma lista combinada das identificações dos fornecedores a partir das tabelas vinho e prato_principal, podemos usar a seguinte consulta SQL:

SELECT v.id_fornecedor
FROM vinho v
UNION
SELECT p.id_fornecedor_principal
FROM prato_principal p
ORDER BY id_fornecedor;

Aqui, começamos selecionando os IDs de fornecedores da tabela vinho (coluna id_fornecedor) e da tabela prato_principal (coluna id_fornecedor_principal) separadamente. Depois, combinamos estas linhas usando a palavra-chave UNION. Finalmente, classificamos o resultado da forma que acharmos melhor:

id_fornecedor
100
200
300
400
500
600

Observe o seguinte ao usar UNION em SQL:

  • Todas as instruções SELECT devem listar o mesmo número de colunas.
  • As colunas correspondentes devem ter o mesmo tipo de dados.
  • As colunas correspondentes podem ter nomes diferentes, como é o caso do nosso exemplo. Por padrão, o nome da coluna exibida no conjunto de resultados será tirado da primeira declaração SELECT. Se necessário, você pode definir nomes para as colunas resultantes usando a palavra-chave AS. Observe que as colunas de tabelas diferentes devem ser nomeadas na mesma ordem para que elas correspondam corretamente.
  • O operador UNION remove as duplicatas do conjunto de resultados. Como você deve ter notado, o id_fornecedor 400 estava em ambas as tabelas, mas aparece apenas uma vez no conjunto de resultados. Se você não quiser que as duplicatas sejam removidas, use o operador UNION ALL:

    SELECT v.id_fornecedor
    FROM vinho v
    UNION ALL
    SELECT p.id_fornecedor_principal
    FROM prato_principal p
    ORDER BY 1;
    

O resultado desta consulta incluirá o id_fornecedor de número 400 duas vezes:

id_fornecedor
100
200
300
400
400
500
600

Se nem CROSS JOIN nem UNION se aplicarem ao seu caso para juntar duas tabelas sem uma coluna comum, confira este artigo com exemplos de JOINs não-equi, onde você encontrará alguns exemplos relevantes.

Hora de praticar o uso de CROSS JOINs e UNIONs!

Agora que você já aprendeu sobre a união de tabelas sem uma coluna comum, está preparado para responder à pergunta "Como juntar duas tabelas sem uma coluna em comum?", muito comum em entrevistas para cargos que utilizam SQL!

Se você quiser saber mais sobre JOINs, confira o vídeo Introdução sobre SQL JOIN da nossa série "We Learn SQL" no YouTube. Experiemente também o guia da LearnSQL.com.br sobre as melhores maneiras de aprender Cláusulas JOIN em SQL.

Entretanto, você já deve saber que o caminho mais curto para se tornar um especialista em SQL é através de muita prática escrevendo consultas. A LearnSQL.com.br oferece um curso completo sobre Cláusulas JOIN em SQL com 93 exercícios interativos. Neste curso, você poderá praticar todos os tipos de exercícios básicos usando JOINs, incluindo CROSS JOINs, Self Join, JOIN não-equi e a junção de várias tabelas.

Bons estudos!