muito obrigado, funcionou....
eu sei que haverá problemas de performance, porém, eu preciso fazer isso devido 
as erros de estrutura do banco =/

________________________________
De: pgbr-geral [[email protected]] em nome de Matheus 
de Oliveira [[email protected]]
Enviado: quarta-feira, 28 de agosto de 2013 14:27
Para: Comunidade PostgreSQL Brasileira
Assunto: Re: [pgbr-geral] (sem assunto)


On Wed, Aug 28, 2013 at 11:05 AM, Felipe Pamboukian 
<[email protected]<mailto:[email protected]>> 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<http://www.dextra.com.br/postgres/>


________________________________

Esta mensagem é destinada exclusivamente para a(s) pessoa(s) a quem é dirigida, 
podendo conter informação confidencial. Se você não for destinatário desta 
mensagem, desde já fica notificado de abster-se a divulgar, copiar, distribuir, 
examinar ou, de qualquer forma, utilizar a informação contida nesta mensagem, 
por ser ilegal. Caso você tenha recebido esta mensagem por engano, pedimos que 
nos retorne este E-Mail, promovendo, desde logo, a eliminação do seu conteúdo 
em sua base de dados, registros ou sistema de controle.

This message is exclusively destined for the people to whom it is directed, and 
it can bear private and/or legally exceptional information. If you are not 
addressee of this message, since now you are advised to not release, copy, 
distribute, check or, otherwise, use the information contained in this message, 
because it is illegal. If you received this message by mistake, we ask you to 
return this email, making possible, as soon as possible, the elimination of its 
contents of your database, registrations or controls system.

Este mensaje ha sido enviado exclusivamente para la(s) persona(s) 
destinataria(s) y puede contener información confidencial. Si Usted no es el 
destinatario, esta desde ya compelido a no divulgar, copiar, distribuir, 
examinar o, de cualquier manera, utilizar la información contenida en este 
mensaje, por razones legales. Caso Usted haya recibido este mensaje 
equivocadamente, favor contestar al remitente en forma inmediata, borrándolo de 
su base de datos, registros o sistema de control.

_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a