Às vezes, mesmo para se fazer uma coisa simples, é necessário um procedimento um pouco mais rebuscado. Já para fazer uma coisa complicada...
O que eu quero fazer não é complicado, mas como eu nunca trabalhei com os INNER, LEFT, RIGHT, OUTER etc., não foi tão trivial assim.
Estou desenvolvendo um pequeno sistema de cobrança (sim, em PHP mesmo!) onde, na listagem de clientes, entre outras coisas, é exibida a cidade e uf a que pertencem.
Até aí, tudo bem! Nada demais. Fiz um JOIN simples:
SELECT cli.*, cid.nome AS nome_cidade, cid.uf
FROM clientes AS cli, cidades AS cid
WHERE cid.id_cidade = cli.cidadeO problema é que, da forma como foi feita, a frase só me retorna os clientes cujo campo cidade esteja preenchido com um valor que conste na tabela cidades. Valores nulos ou inexistentes não retornam os registros.
Uma "solução" (ou seria bacalhau?? [1]) para isso seria não permitir a deleção da cidade na sua tabela, mas isso acaba nos limitando, por diversos motivos.
Eu nunca fiz um JOIN que me retornasse registros desta forma (com os correspondentes nulos ou inexistentes), mas chegara a hora de ter de fazê-lo.
Pesquisando um pouco (foi pouco mesmo!), descobri como fazer um JOIN que me retornasse o que a query acima me retorna:
SELECT * FROM clientes AS cli
INNER JOIN cidades AS cid ON cli.cidade = cid.id_cidadeBom, até aí, tudo bem! Mas não resolveria o meu problema...
Lembrando um pouco do que eu já tinha lido sobre o tema, percebi o "INNER" na frase e imaginei que seu oposto seria o "LEFT OUTER". Logo cheguei à seguinte formulação:
SELECT * FROM clientes AS cli
LEFT OUTER JOIN cidades AS cid ON cli.cidade = cid.id_cidadeEi-lo como qui-lo! (Ou quase...)
A sentença me retornou todos os campos da tabela de clientes, inclusive aquele registro que tinha o cídogi inválido para a cidade. Agora só faltava manipular os nomes dos campos, por causa da duplicidade (nome do cliente x nome da cidade):
SELECT cli.*, cid.nome AS nome_cidade, cid.uf
FROM clientes AS cli
LEFT OUTER JOIN cidades AS cid ON cli.cidade = cid.id_cidade
Nenhum comentário:
Postar um comentário