Pular para o conteúdo
Visualizando 11 posts - 1 até 11 (de 11 do total)
  • Autor
    Posts
  • #97315
    apalmeira
    Participante

      Olá pessoal,

      Estou fazendo a sql abaixo, porém, quando coloco o order by dentro do subselect ocorre o erro:
      ORA-00907: parêntese direito não encontrado

      Funciona se eu remover o order by, porém, preciso dele para retornar o ultimo registro do processo na tabela followup.


      SELECT
      P.ID,
      P.NREF,
      P.CLIENTE_ID,
      P.FORNECEDOR_ID,

      (SELECT
      FLP.INSERT_DATA
      FROM
      SIS.FOLLOWUP FLP
      WHERE
      ROWNUM = 1
      AND
      FLP.PROCESSO = P.NREF
      ORDER BY FLP.ID)

      FROM
      SIS.ABREPROCESSO P

      #97316
      Manoel872
      Participante

        Utiliza as funções max para conseguir pegar o ultimo registro.

        Att,

        #97318
        apalmeira
        Participante

          Mas eu preciso do ultimo registro somente da tabela followup que está no subselect, não da tabela abreprocesso.

          É possível fazer isso com o max? teria um exemplo?

          Grato.

          #97321
          burga
          Participante

            Acredito que o manoel quiz dizer pra você fazer isto:

            SELECT
            P.ID,
            P.NREF,
            P.CLIENTE_ID,
            P.FORNECEDOR_ID,
            MIN(FLP.INSERT_DATA)
            FROM
            SIS.ABREPROCESSO P
            LEFT OUTER JOIN SIS.FOLLOWUP FLP
            ON FLP.PROCESSO = P.NREF
            GROUP BY
            P.ID,
            P.NREF,
            P.CLIENTE_ID,
            P.FORNECEDOR_ID;

            #97324
            apalmeira
            Participante

              burga,

              funcionou, porém, eu preciso retornar outros campos e utilizando o max a sql pode nao retornar o ultimo registro da tabela followup.

              você conhece alguma solução? no firebird eu resolvia isso com o (first 1 e order by).


              SELECT
              P.ID,
              P.NREF,
              P.CLIENTE_ID,
              P.FORNECEDOR_ID,
              MAX(FLP.ID),
              MAX(FLP.INSERT_DATA),
              MAX(PFLP.ID)
              FROM
              SIS.ABREPROCESSO P
              LEFT OUTER JOIN SIS.FOLLOWUP FLP ON FLP.PROCESSO = P.NREF
              LEFT OUTER JOIN SIS.POSICAOFLP PFLP ON FLP.POSICAOFLP_ID = PFLP.ID
              GROUP BY
              P.ID,
              P.NREF,
              P.CLIENTE_ID,
              P.FORNECEDOR_ID;

              #97325
              Peterson
              Participante

                Tente:

                SELECT
                p.id,
                p.nref,
                p.cliente_id,
                p.fornecedor_id
                flp.id,
                flp.insert_data,
                FROM
                SIS.ABREPROCESSO p
                LEFT OUTER JOIN (SELECT id, insert_data FROM SIS.FOLLOWUP WHERE id=(SELECT MAX(id) FROM SIS.FOLLOWUP)) FLP

                Não sei se deu pra entender. Minha sugestão é usar uma view in line na LEFT OUTER JOIN. Fiz um teste aqui mais simples que o seu ambiente e funcionou.

                #97326
                Ishii
                Participante

                  Olá,

                  Sugiro vc dar uma olhada nas funções analíticas do Oracle ( função (over )

                  http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions073.htm#i83648

                  Essa função é a LAST_VALUE e combinada com o OVER acho que pode ter dar uma luz no que você precisa. Tente montar a query e qualquer coisa coloque aqui as dúvidas…Tem outras como FIRST_VALUE mas melhor você analisar e ver qual é a melhor para você.

                  []s Ishii

                  ps: no ASKTOM.oracle.com tem um exemplo de como se usa essas funções

                  http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:3170642805938

                  #97327
                  apalmeira
                  Participante

                    Deu esse erro:

                    ORA-00905: palavra-chave não encontrada

                    #97328
                    apalmeira
                    Participante

                      Galera,

                      Assim funcionou:

                      Valeu pela força!


                      SELECT DISTINCT
                      P.ID AS PROC_ID,
                      P.NREF,

                      (
                      SELECT
                      F.INSERT_DATA
                      FROM
                      SIS.FOLLOWUP F
                      WHERE
                      F.ID = (SELECT MAX(ID) FROM SIS.FOLLOWUP T WHERE T.PROCESSO = P.NREF)
                      ) AS FLP_DATA,

                      (
                      SELECT
                      F.ID
                      FROM
                      SIS.FOLLOWUP F
                      WHERE
                      F.ID = (SELECT MAX(ID) FROM SIS.FOLLOWUP T WHERE T.PROCESSO = P.NREF)
                      ) AS FLP_ID,

                      (
                      SELECT
                      F.POSICAOFLP_ID
                      FROM
                      SIS.FOLLOWUP F
                      WHERE
                      F.ID = (SELECT MAX(ID) FROM SIS.FOLLOWUP T WHERE T.PROCESSO = P.NREF)
                      ) AS POSICAOFLP_ID

                      FROM
                      SIS.ABREPROCESSO P

                      #97329
                      apalmeira
                      Participante

                        Ah,

                        Se alguem souber de uma forma mais simples, por favor, poste o código.

                        Abraços.

                        #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
                          

                        Visualizando 11 posts - 1 até 11 (de 11 do total)
                        • Você deve fazer login para responder a este tópico.