Pergunta

Existe uma maneira de dar uma subconsulta no Oracle 11g um pseudônimo como:

select * 
from
    (select client_ref_id, request from some_table where message_type = 1) abc,
    (select client_ref_id, response  from some_table where message_type = 2) defg
where
    abc.client_ref_id = def.client_ref_id;

Caso contrário, existe uma maneira de ingressar nas duas subconsivas com base no client_ref_id. Sei que há uma junção de si, mas no banco de dados que estou executando em uma junção de si podem levar até 5 minutos para ser concluída (há alguma lógica extra na consulta real que estou executando, mas eu determinei que a junção é o que é o que é causando o problema). As subconsações individuais levam apenas alguns segundos para serem concluídos por eles. A consulta de junção de si se parece com:

select st.request, st1.request
from
    some_table st, some_table st1
where 
    st.client_ref_id = st1.client_ref_id;
Foi útil?

Solução

WITH abc as (select client_ref_id, request from some_table where message_type = 1)
select * 
from abc
    inner join 
    (select client_ref_id, response  from some_table where message_type = 2) defg
on   abc.client_ref_id = def.client_ref_id;

Outras dicas

Não tenho uma instância do Oracle para testar, mas o que você postou deve ser válido ANSI-89 Sintaxe. Aqui está no ANSI-92:

SELECT *
  FROM (SELECT client_ref_id, request 
          FROM SOME_TABLE 
         WHERE message_type = 1) abc
  JOIN (SELECT client_ref_id, request 
          FROM SOME_TABLE 
         WHERE message_type = 1) defg ON defg.client_ref_id = abc.client_ref_id

Sua consulta deve ficar bem.

Uma alternativa seria:

select abc.client_ref_id, abc.request, def.response
from   some_table abc,
       some_table def
where  abc.client_ref_id = def.client_ref_id
and    abc.message_type = 1
and    def.message_type = 2;

Eu não ficaria surpreso se o Oracle reescreva as consultas para que o plano fosse o mesmo de qualquer maneira.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top