[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