Pular para o conteúdo

Fóruns SQL e PL/SQL Order By em subselect [Resolvido] Order By em subselect [Resolvido]

#97450
fsitja
Participante

    Olá,

    Do jeito abaixo pode não ser mais simples para ler, mas fica mais simples para o otimizador e para o banco de dados em matéria de performance pois a tabela FOLLOWUP só é acessada uma vez em vez de 3:


    SELECT p.id proc_id,
    f.insert_data flp_data,
    f.id flp_id,
    f.posicaoflp_id
    FROM abreprocesso p
    LEFT JOIN (select f.nref,
    max(id) id,
    max(f.insert_data) keep (dense_rank last order by (f.id)) insert_data,
    max(f.posicaoflp_id) keep (dense_rank last order by (f.id)) posicaoflp_id
    from followup f
    group by f.nref) f
    ON f.nref = p.nref;

    Exemplo de execução:

    SQL> with abreprocesso as (
    2 select 1 id, 100 nref from dual
    3 ),
    4 followup as (
    5 select 555 id, 100 nref, to_date('06/01/2010', 'DD/MM/YYYY') insert_data, 'A' posicaoflp_id from dual union
    6 select 556, 100, to_date('02/01/2010', 'DD/MM/YYYY'), 'B' from dual union
    7 select 557, 100, to_date('03/01/2010', 'DD/MM/YYYY'), 'C' from dual
    8 ) -- fim dos dados de exemplo
    9 SELECT p.id proc_id,
    10 f.insert_data flp_data,
    11 f.id flp_id,
    12 f.posicaoflp_id
    13 FROM abreprocesso p
    14 LEFT JOIN (select f.nref,
    15 max(id) id,
    16 max(f.insert_data) keep (dense_rank last order by (f.id)) insert_data,
    17 max(f.posicaoflp_id) keep (dense_rank last order by (f.id)) posicaoflp_id
    18 from followup f
    19 group by f.nref) f
    20 ON f.nref = p.nref;

    PROC_ID FLP_DATA FLP_ID POSICAOFLP_ID


         1 3/1/2010           557 C