2013/10/1 Thiago <zan...@farmaponte.com.br>

> On 01/10/2013 10:57, Guimarães Faria Corcete DUTRA, Leandro wrote:
>
>> 2013/10/1 Thiago <zan...@farmaponte.com.br>:
>>
>>> 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
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Reply via email to