Como fazer JOIN entre tabelas sem chaves estrangeiras?
Normalmente, JOINs no SQL utilizam chaves primárias e estrangeiras para conectar tabelas. No entanto, em alguns casos, podemos precisar unir tabelas que não possuem chaves estrangeiras explícitas.
Usando JOIN baseado em colunas comuns
Se houver uma coluna que represente um vínculo entre as tabelas, podemos utilizá-la para fazer o JOIN:
SELECT clientes.nome, pedidos.id, pedidos.valor
FROM clientes
INNER JOIN pedidos ON clientes.email = pedidos.email_cliente;
Aqui, estamos conectando as tabelas clientes
e pedidos
através do campo email
, assumindo que ele pode ser um identificador único.
Usando LIKE para unir registros com padrões semelhantes
Se os valores das colunas forem parecidos, podemos utilizar LIKE
:
SELECT usuarios.nome, logs.acao
FROM usuarios
INNER JOIN logs ON logs.descricao LIKE CONCAT('%', usuarios.nome, '%');
Isso pode ser útil para bases de dados não normalizadas.
Criando uma chave temporária para JOIN
Se não houver colunas comuns diretas, podemos criar uma relação temporária:
SELECT u.nome, c.empresa
FROM usuarios u
INNER JOIN clientes c ON LEFT(u.documento, 8) = LEFT(c.cnpj, 8);
Isso permite unir tabelas onde apenas parte dos valores são idênticos.
Quando evitar JOINs sem chaves estrangeiras?
- Se os dados não forem bem estruturados, pode haver erros e inconsistências.
- JOINs sem chaves explícitas podem ser mais lentos, especialmente se forem aplicadas funções em colunas.
- Sempre que possível, melhore a modelagem do banco para incluir relacionamentos claros.
Quando fazer JOINs sem chaves estrangeiras no SQL?
JOINs sem chaves estrangeiras são comuns em bancos de dados legados ou sistemas onde a normalização não foi aplicada corretamente. Em muitos casos, é necessário unir tabelas utilizando colunas textuais, IDs inconsistentes ou até mesmo partes de strings. Técnicas como LIKE
, SUBSTRING()
e SOUNDEX()
podem ser úteis para estabelecer relações aproximadas entre tabelas. No entanto, sempre que possível, é recomendável revisar a modelagem dos dados para evitar esse tipo de necessidade e garantir melhor desempenho e integridade nas consultas.
Algumas aplicações:
- Unir dados de sistemas diferentes sem um identificador comum
- Relacionar registros de tabelas legadas sem normalização
- Encontrar conexões aproximadas entre valores semelhantes
- Combinar dados textuais para análise sem estrutura rígida
- Realizar consultas exploratórias em bancos de dados não normalizados
Dicas para quem está começando
- Se possível, normalize o banco e crie chaves estrangeiras
- Utilize
LIKE
eSUBSTRING()
apenas se não houver alternativas melhores - Evite funções em colunas dentro do JOIN, pois podem impactar a performance
- Se precisar unir bases diferentes, considere criar índices temporários
- Para grandes volumes de dados, prefira criar tabelas intermediárias com identificadores comuns
Contribuições de Fernando Albuquerque