2010-06-16 9 views
13

¿Hay una manera de dar una sub consulta en Oracle 11g como un alias:¿Hay alguna manera de darle a una subconsulta un alias en Oracle 11g SQL?

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 doy cuenta de que existe una unión automática, pero en la base de datos que estoy ejecutando en una autocombinación puede tomar hasta 5 minutos en completarse (existe una lógica extra en la consulta real que estoy ejecutando pero he determinado que la auto unión es lo que es causando el problema). Las subconsultas individuales solo tardan unos segundos en completarse ellas mismas. La consulta auto unirse ve algo como:

select st.request, st1.request 
from 
    some_table st, some_table st1 
where 
    st.client_ref_id = st1.client_ref_id; 
+0

Simplemente curioso, ¿qué tan bien funcionó la respuesta aceptada? – DCookie

+1

No has descubierto que es la auto-unión. Haga una copia idéntica de la tabla, los índices y las estadísticas y vea si obtiene el mismo tiempo. La mejor pregunta habría sido: "Ayúdame a ajustar esta consulta" y ha publicado la consulta COMPLETA y el plan de explicación. –

Respuesta

16
 
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; 
+0

¿Cuál es el término técnico para la parte "WITH abc as (select ...)"? Si uno quisiera investigar sobre sus capacidades. – SeaBass

+2

@SeaBass: Expresiones de tabla comunes, frecuentemente abreviadas como CTE (también se usa con frecuencia como el nombre/alias, aunque esta vez no lo hice). Tenga en cuenta que ambas "tablas" podrían haberse hecho como parte del CTE, solo quería mostrar ambas opciones, por lo que hice una forma y la otra, la otra. – jmoreno

5

no tengo una instancia de Oracle para probar con, pero lo que usted envió deben ser válidos ANSI-89 JOIN sintaxis. 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 
3

Su consulta debería 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; 

que no se sorprendería si Oracle volvió a escribir las consultas para que el plan sería el mismo de todos modos.

+0

Esta solución es lo que tarda tanto en completarse en la base de datos que estoy usando. La declaración 'abc.client_ref_id = def.client_ref_id' hace que la consulta pase de unos segundos a más de una hora para completarse. –

+0

Tienes que tener mucho cuidado con el tiempo. ¿Estás hablando de la sincronización de la última fila? o solo primeras filas? Ciertos planes de consulta pueden producir 1 fila muy rápido (un segundo) pero tomaría un año producir la última fila. Mientras que otros obtendrían la última fila en un minuto. –

+0

@Matt, publique el plan de consulta; no es bueno rebuscar con el SQL cuando no sabemos qué está causando el problema de rendimiento. –

Cuestiones relacionadas