在Oracle的过程中重用select查询

时间:2010-03-23 16:21:43

标签: sql oracle plsql

如何存储select语句的结果,以便我可以将结果与in子句一起用于其他查询?这是一些伪代码:

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;

...或者如果我只是将子查询放在两个select语句中,优化器会为我做这个吗?

编辑:这里有关于我的表格结构的更多信息。

基本上table1是一个标准表,其中id是主键。 table2有一个3列主键,其中id是其中一列。在我的情况下,table2中的id将出现在三行中。

1 个答案:

答案 0 :(得分:7)

您可以使用SQL表对象来存储select的结果并重用它。它将消耗更多内存,并且只有在第一个SELECT需要大量时间时才有效。

CREATE TYPE tab_number IS TABLE OF NUMBER;
/

您可以将它与BULK COLLECT 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;

在版本9i中,您需要使用CAST查询表:

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

或者,您可以使用GLOBAL TEMPORARY TABLE来存储中间结果集。