Domanda

C'è un modo per dare una subquery in Oracle 11g un alias come:

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;

In caso contrario, c'è un modo per unire le due sottoquery in base alla client_ref_id. Mi rendo conto che v'è un self join, ma sulla base di dati io sono in esecuzione su un self join può richiedere fino a 5 minuti a completa (c'è una logica in più nella query reale Sono in esecuzione, ma ho determinato l'auto join è ciò che è la causa del problema). I singoli subquery prendono solo pochi secondi per completare da loro stessi. L'auto join sguardi di query qualcosa del tipo:

select st.request, st1.request
from
    some_table st, some_table st1
where 
    st.client_ref_id = st1.client_ref_id;
È stato utile?

Soluzione

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;

Altri suggerimenti

Non ho un'istanza Oracle per test con, ma quello che hai postato dovrebbe essere valido ANSI-89 JOIN sintassi. Qui è in 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

La vostra query dovrebbe andare bene.

Un'alternativa potrebbe essere:

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;

non sarei sorpreso se Oracle ha riscritto le query in modo che il piano sarebbe stato lo stesso in ogni caso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top