在 Oracle 的过程中重用选择查询

Posted

技术标签:

【中文标题】在 Oracle 的过程中重用选择查询【英文标题】:Reuse select query in a procedure in Oracle 【发布时间】:2010-03-23 16:21:43 【问题描述】:

如何存储 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】:

您可以使用 SQL 表对象来存储选择的结果并重复使用它。它会消耗更多的内存,并且只有在第一个 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 来存储中间结果集。

【讨论】:

以上是关于在 Oracle 的过程中重用选择查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle with重用子查询

如何在 Oracle SQL 语句中重用动态列?

在 CodeIgniter 中重用 oracle 序列中的值

重用选择子查询/结果

在 WHERE 子句中重用选择表达式的子查询

Informix SQL / 在另一个查询中重用存储过程的结果