[firebase-br] Join trazer qtde determinada

Elton da Motta Barbosa embarbosa em gmail.com
Qui Out 22 09:50:27 -03 2009


Olá Alexandre,

  desculpa a demora na resposta, mas estou bem apertado no serviço.
Então sem mais delongas, vamos ao que interessa:

>Elton, acredito que é referente a sub-select dentro da do left outer join
>que segundo alguns colegas do gropo nas versões 2.1.xx está aceitando está
>sintax, mas ele critica o campo FUN.CFG_EMPRESA que não faz parte da
>sub-select. Quando eu tiro, para teste, o campo na where da sub-select que
>não faz parte da da tabela da mesma (FUN.CFG_EMPRESA) não dar erro, mas da
>problema no result, porque puxa a 1ª ferias independente do funcionário.

Sim, realmente é referente ao que você disse. No entanto, num teste
que eu fiz aqui, numa estrutura de select semelhante, nem no FB 2.1.x
eu consegui executar o subselect passando como parâmetro. Não tenho
costume de fazer este tipo de select, então não sei te explicar
exatamente o que aconteceu. Mas enfim, se alguém quiser testar e
explicar eis abaixo um select que gera o erro COLUMN UNKNOW mesmo na
versão 2.1.3:

select * from teste1 t1
inner join (select * from teste2 b1
            where (b1.codigo = t1.cod) ) on (t1.cod = b1.codigo)


>Bem, não sei se deu pra vc endetender, mas o problema e em um campos
>(FUN.CFG_EMPRESA) que não faz parte da tabela da sub-select no segundo left
>outer join.

Deu pra entender sim. O Subselect não reconhece as tabelas fun e sf.
Temos duas opções:

1) ou Mudar o escopo do select passando a tabela ferias para fora.
Acho essa opção mais clara e é a opção que eu recomendo (mesmo que a
segunda opção funcione...), mas não tive tempo de testar... ;o)

select first 1
  sf.sfo_codigo,
  sf.sfo_nome,
  fun.cfg_chapa,
  fun.cfg_nome,
  fer2.fer_funcionario,
  fer2.fer_ano,
  fer2.fer_mes
from ferias fer2
left outer join funcionarios fun on (fer2.fer_empresa =
fun.cfg_empresa) and (fer2.fer_funcionario = fun.cfg_cpf)
left outer join setores_folha sf on  (fun.cfg_empresa =
sf.sfo_empresa) and (fun.cfg_setor = sf.sfo_codigo) and
(fun.cfg_condicao = '1')
where (sf.sfo_empresa = :empresa) and (sf.sfo_codigo = :setor)

também, observe a NOTA no final desse e-mail.

2) fazer uma alteração no subselect incluindo a tabela fun antes.
Observe a alteração:

select
  sf.sfo_codigo,
  sf.sfo_nome,
  fun.cfg_chapa,
  fun.cfg_nome,
  fer2.fer_funcionario,
  fer2.fer_ano,
  fer2.fer_mes
from setores_folha sf
left outer join funcionarios fun on (fun.cfg_empresa = sf.sfo_empresa) and
(fun.cfg_setor = sf.sfo_codigo) and (fun.cfg_condicao = '1')
left outer join (select first 1 fer1.* from ferias fer1
left outer join funcionarios fun_t on (fer1.fer_empresa =
fun_t.cfg_empresa) and (fer1.fer_funcionario = fun_t.cfg_cpf) order by
fer1.fer_ano desc, fer1.fer_mes desc) as fer2 on (fer2.fer_empresa =
fun.cfg_empresa) and (fer2.fer_funcionario = fun.cfg_cpf)
where (sf.sfo_empresa = :empresa) and (sf.sfo_codigo = :setor)

NOTA: A propósito, você gostaria de listar férias não designadas a
nenhum funcionário e/ou funcionários sem férias? Em caso negativo acho
que no select deveriam ser alterados os "left outer join" para "inner
join" em cada caso... faça o teste pois isso poderia reduzir em muito
o tempo de calculo.

EQA (Espero Que Ajude)




Mais detalhes sobre a lista de discussão lista