Esiste un modo per dare un subquery un alias in Oracle 11g SQL?
-
27-09-2019 - |
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;
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.