- Este tópico contém 10 respostas, 6 vozes e foi atualizado pela última vez 15 anos, 2 meses atrás por
fsitja.
-
AutorPosts
-
16 de dezembro de 2010 às 3:16 pm #97315
apalmeira
ParticipanteOlá 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 encontradoFunciona 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
16 de dezembro de 2010 às 3:25 pm #97316Manoel872
ParticipanteUtiliza as funções max para conseguir pegar o ultimo registro.
Att,
16 de dezembro de 2010 às 4:09 pm #97318apalmeira
ParticipanteMas 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.
16 de dezembro de 2010 às 4:26 pm #97321burga
ParticipanteAcredito 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;16 de dezembro de 2010 às 5:23 pm #97324apalmeira
Participanteburga,
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;
16 de dezembro de 2010 às 6:22 pm #97325Peterson
ParticipanteTente:
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)) FLPNã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.
16 de dezembro de 2010 às 7:37 pm #97326Ishii
ParticipanteOlá,
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
16 de dezembro de 2010 às 7:39 pm #97327apalmeira
ParticipanteDeu esse erro:
ORA-00905: palavra-chave não encontrada
16 de dezembro de 2010 às 7:46 pm #97328apalmeira
ParticipanteGalera,
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_IDFROM
SIS.ABREPROCESSO P
16 de dezembro de 2010 às 7:48 pm #97329apalmeira
ParticipanteAh,
Se alguem souber de uma forma mais simples, por favor, poste o código.
Abraços.
27 de dezembro de 2010 às 10:02 pm #97450fsitja
ParticipanteOlá,
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 -
AutorPosts
- Você deve fazer login para responder a este tópico.