2013/10/1 Thiago <[email protected]> > On 01/10/2013 10:57, Guimarães Faria Corcete DUTRA, Leandro wrote: > >> 2013/10/1 Thiago <[email protected]>: >> >>> from tb_venda a >>> full outer join tb_meta b on a.loja = b.loja >>> >> >> Pode simplificar com ON loja, já que os nomes são consistentes. >> >> Se houver a restrição de integridade referencial, pode até fazer o >> NATURAL JOIN, sem precisar de ON. >> > > Obrigado pela dica, não conhecia esta sintaxe. > > O NATURAL JOIN não faz sentido no cenário do OP, porque ele quer um outer. E, além disso, eu, particularmente (minha opinião somente), não gosto de usar o NATURAL JOIN, acho ele um tanto quanto, digamos, frágil. Pois, imagine, tudo roda bem, até que se faz um ALTER TABLE e adiciona em uma das tabelas uma coluna de mesmo nome que da outra, mas que não é relacionamento, ou seja, não possui os mesmos valores para as tuplas relacionadas. O NATURAL JOIN não tem nada a ver com integridade referencial, ele basicamente faz um INNER JOIN de todas as colunas com o mesmo nome nas duas tabelas. Em casos como esse, eu recomendaria o USING.
> O que fazer quando eu não tenho registros na tabela tb_venda, tenho apenas >>> na tabela meta? >>> >> >> Você pode dar o exemplo de como ficariam as tabelas base, nesse caso? >> > > Da seguinte forma: > > tb_venda > loja venda > > > tb_meta > loja meta > 2 40 > 3 60 > > Neste caso, tendo a tabela tb_venda como principal (esquerda) gostaria de > ter o seguinte resultado: > > > loja venda meta > 2 0 40 > 3 0 60 > > Pensando em "principal" (esquerda), eu diria que a sua principal é a tb_meta, pois você sempre quer o resultado dela, logo sua consulta seria algo mais ou menos assim: SELECT loja, coalesce(b.venda,0) as venda, coalesce(a.meta,0) as meta FROM tb_meta a LEFT OUTER JOIN tb_venda b USING(loja); De forma simplificada, podemos dizer que o FULL OUTER JOIN deve ser usado somente quando você quer "ver" TODOS os registros de TODAS as tabelas. Quando você quer todos de apenas uma, utilize o LEFT ou RIGHT JOIN. > Aliás, evite esses prefixos como ‘tb_’. Eles acabam atrapalhando à >> medida em que o modelo evolui e você substitui tabelas por visões e >> vice-versa. >> > > Obrigado por essa dica também. > > +1. Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
