2010-03-23 19 views
5

¿Cómo almacenaría el resultado de una instrucción seleccionada para poder reutilizar los resultados con una cláusula in para otras consultas? Aquí hay un código de pseudo:Reutilizar la consulta de selección en un procedimiento en Oracle

declare 
    ids <type?>; 
begin 
    ids := select id from table_with_ids; 
    select * from table1 where id in (ids); 
    select * from table2 where id in (ids); 
end; 

... o lo hará el optimizador esto para mí si sólo lleva el sub-consulta en ambas sentencias de selección?

EDITAR: Aquí hay más información sobre la estructura de mis tablas.

Básicamente table1 es una tabla estándar con el id como clave principal. Mientras que table2 tiene una clave primaria de 3 columnas con id es una de esas columnas. En mi caso, la identificación en la tabla 2 aparecerá en tres filas.

Respuesta

7

Puede usar un objeto de tabla SQL para almacenar el resultado de la selección y reutilizarlo. Se consumirá más memoria y probablemente solo será eficiente si el primer SELECT toma mucho tiempo.

CREATE TYPE tab_number IS TABLE OF NUMBER; 
/

Se podría utilizarlo con un granel Tomar cláusula INTO:

DECLARE 
    ids tab_number; 
BEGIN 
    SELECT id BULK COLLECT INTO ids FROM table_with_ids; 
    SELECT * /*into ??*/ 
    FROM table1 
    WHERE id IN (SELECT column_value FROM TABLE(ids)); 
    SELECT * /*into ??*/ 
    FROM table2 
    WHERE id IN (SELECT column_value FROM TABLE(ids)); 
END; 

En la versión 9i y antes de que tendría que utilizar CAST para consultar la tabla:

SELECT * 
    FROM table2 
WHERE id IN (SELECT column_value FROM CAST (TABLE(ids) AS tab_number)); 

Alternativamente, puede usar GLOBAL TEMPORARY TABLE para almacenar el conjunto de resultados intermedios.

+0

@Peter: tienes razón, no he probado mi código (!). Actualicé mi respuesta, gracias. –

+0

¡Muchas gracias! – Jeremy

Cuestiones relacionadas