On Wed, Aug 28, 2013 at 11:05 AM, Felipe Pamboukian <
felipe.pambouk...@ibope.com> wrote:

>  Bom dia,
>
>  Gostaria de fazer um case com inner join mais não estou conseguindo,
> alguém posso de dar uma ajuda?
>
>
>  select mte.idrepesportesmt, esp.codesporte, esp.esporte,
>     sb.codsubesporte, sb.subesporte, mte.iduser, u.login, mt.tipomidia,
>     rd.emissora, mte.coletado, mt.dia, mt.mes, mt.ano, rd.codrede,
> mt.rotulo,
>     case when mt.tipomidia = 'VHS' then pr.praca else 'NACIONAL - NET' end
> as praca,
>     case when mte.coletado = '0' then 'Não Coletar' else 'Coletar' end as
> coletadoo,
>     case when mte.estado = '0' then 'Pendente'
>          when mte.estado = '1' then 'Concluído'
>          when mte.estado = '2' then 'Em andamento' end as estado,
>     case when mte.estado_user = '0' then 'Pendente'
>          when mte.estado_user = '1' then 'Concluído'
>          when mte.estado_user = '2' then 'Em andamento' end as
> estado_usuario
> from repesportesmt mte
>      inner join cm_esporte esp on esp.codesporte = mte.codesporte
>      inner join reportagemmt mt on mt.idreportagemmt = mte.idreportagemmt
>      inner join jvtv_redes rd on rd.codrede = mt.codrede
>      inner join cm_subesporte sb on sb.codsubesporte = mte.codsubesporte
>      inner join usuarios u on u.iduser = mte.iduser
> *     case when mt.tipomidia = 'VHS' then *
> *      inner join cli_midia mi on mi.rotulo = mt.rotulo*
> *        inner join jvtv_pracas pr on pr.codpraca = mi.codpraca_grav*
> *     else*
> *      inner join cli_dia d on d.rotulodia = mt.rotulo*
> *   inner join jvtv_pracas pr on pr.codpraca = d.codpraca*
> *     end*
> where mt.ano = :ano and mt.mes = :mes and mte.estado = :estado
> order by rd.emissora, pr.praca, mt.rotulo, mt.dia, esp.esporte,
> sb.subesporte
>
>
Me parece que o ideal seria fazer isso num condicional em sua aplicação ou
uma função no banco. Não é possível selecionar condicionalmente a tabela ao
realizar JOIN. Uma saída via SQL é realizar um LEFT JOIN (veja que não é
equivalente, vai depender de questões semânticas):

...
      left join cli_midia mi on mi.rotulo = mt.rotulo
      left join cli_dia d on d.rotulodia = mt.rotulo
      inner join jvtv_pracas pr on pr.codpraca = case mt.tipomidia when
'VHS' then mi.codpraca_grav else d.codpraca end
...

Acho ("acho") que assim funciona, mas com certeza tem implicações negativas
quanto à performance.

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

Responder a