¿Hay una manera de dar una subconsulta un alias en Oracle 11g SQL?
-
27-09-2019 - |
Pregunta
¿Hay una manera de dar una sub consulta en Oracle 11g como un alias:
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;
De lo contrario hay una manera de unir las dos sub consultas basadas en el client_ref_id. Me di cuenta que es un auto unirse, pero en la base de datos Estoy corriendo en un auto combinación puede tardar hasta 5 minutos para completar (hay cierta lógica adicional en la consulta real Estoy corriendo pero he determinado la propia unión es lo que es la causa del problema). Las sub consultas individuales sólo tienen unos pocos segundos para completar por ellos mismos. El auto se unen a las miradas de consulta algo como:
select st.request, st1.request
from
some_table st, some_table st1
where
st.client_ref_id = st1.client_ref_id;
Solución
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;
Otros consejos
No tengo una instancia de Oracle a prueba con, pero lo que debería ser informados ANSI-89 válida la sintaxis de combinación. Aquí está en 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
Su consulta debe estar bien.
Una alternativa sería:
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;
Me no se sorprenda si Oracle volvió a escribir las consultas para que el plan sería el mismo de todos modos.