[firebase-br] Produto cartesiano - Problema resolvido

Francisco Thiago jeandeadlucky em yahoo.com.br
Qui Ago 11 13:39:12 -03 2005


Caros amigos,

Dias atrás eu mandei uma pergunta de como solucionar um select envolvendo 
algumas tabelas

Conhecimento
  (1,4)
   |
  (0,1)
Endereco
   (1)
    |
    |
  (1,N)
Pessoa(0,1) -----(1) Fisica*
   |
   |(0,1)________(1) Juridica*

(os números entre parenteses são a cardinalidade... Não sei se está certo, 
faltei nas aulas de análise :D )
*Uma pessoa não pode ser física e jurídica conceitualmente, embora 
fisicamente seja possível.


O problema, para os que não lembram, é que estava tranzendo vários registros 
um select nos conhecimentos (com join nas tabelas supracitadas)... sem 
contar que As Views da tabela pessoa estavam pesadíssimas por causa do uso 
do Union. Estava fazendo um Union para as pessoas física e jurídicas.

Solucionei o caso com os conhecimentos da seguinte maneira (não vou passar o 
select inteiro pq ele é gigante)
select CAD_CONHECIMENTOS.CONH_CODIGO
     , coalesce(CONS_J.CJUR_CNPJ,CONS_F.CFIS_CPF) as CONS_CPF_CPNJ
     , coalesce(CONS_J.CJUR_RAZAO_SOCIAL,CONS_P.PESS_NOME) as 
CONS_RAZAO_SOCIAL
from Cad_Conhecimentos
  left join CAD_ENDERECO CONS_E on CONS_E.CEND_CODIGO = 
CAD_CONHECIMENTOS.CEND_CODIGO_CONSIGNATARIO
  left join CAD_PESSOA CONS_P on CONS_P.PESS_CODIGO = CONS_E.PESS_CODIGO
  left join CAD_JURIDICA CONS_J on CONS_J.PESS_CODIGO = CONS_E.PESS_CODIGO
  left join CAD_FISICA  CONS_F on CONS_F.PESS_CODIGO = CONS_E.PESS_CODIGO 
and CONS_J.CJUR_CODIGO is null  -- pulo do gato
Ou seja, ele traz apenas registro de pessoa física caso não tenha achado 
nada em jurídica (Jurídica tem preferência sobre física).
Antes tinha um problema com o endereco tb. Mas o cliente pediu para gravar o 
endereco da pessoa, o que facilitou bastante.

Enquanto as views, apliquei o mesmo conceito:
select (...)
    , coalesce(CAD_JURIDICA.CJUR_CODIGO,CAD_FISICA.CFIS_CODIGO)
    , coalesce(CAD_JURIDICA.CJUR_INSCEST,CAD_FISICA.CFIS_RG)
    , coalesce(CAD_JURIDICA.CJUR_CNPJ,CAD_FISICA.CFIS_CPF)
    , CAD_FISICA.CFIS_DATANASCIMENTO
    , coalesce(CAD_JURIDICA.CJUR_RAZAO_SOCIAL,CAD_PESSOA.PESS_NOME)
from CAD_PESSOA
  left join CAD_JURIDICA on CAD_JURIDICA.PESS_CODIGO = 
CAD_PESSOA.PESS_CODIGO
  left join CAD_FISICA on CAD_FISICA.PESS_CODIGO = CAD_PESSOA.PESS_CODIGO 
and CAD_JURIDICA.CJUR_CODIGO is null
  left join CAD_ENDERECO on CAD_ENDERECO.PESS_CODIGO = 
CAD_PESSOA.PESS_CODIGO

Embora não tenha opinado nada neste assunto em particular, devo agradecer ao 
amigo Eduardo Jedliczka, que outro dia me ajudou num sql para descobrir "não 
relação" entre uma tabela e outra. Essa dica foi fundamental para a montagem 
dos Select's.


Resolvi postar esta solução para o caso de algum amigo estar passando pelo 
mesmo problema...

[]'s

Francisco Thiago de Almeida
Enter & Plug Informática
Divisão: Desenvolvimento e Banco de dados
Franca / SP
msn: thiago em enterplug.com.br



	
	
		
_______________________________________________________ 
Yahoo! Acesso Grátis - Internet rápida e grátis. 
Instale o discador agora! http://br.acesso.yahoo.com/





Mais detalhes sobre a lista de discussão lista