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

标签 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;

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

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

基本上 table1 是一个标准表,id 是主键。虽然 table2 有一个 3 列的主键,其中 id 是这些列之一。在我的例子中,table2 中的 id 将出现在三行中。

最佳答案

您可以使用 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存储中间结果集。

关于sql - 在 Oracle 的过程中重用选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2501683/

相关文章:

oracle - 检测for循环中的最后一条记录

sql - Oracle PL/SQL 数据类型

SQL:将一个表中的所有记录插入到另一表中,而不指定列

sql - T-SQL 中的幂律分布

sql - 我需要在 sql 中做一个 View ,返回每个公司的最新发票日期

oracle - BEA-141297-无法获取服务器文件锁

java - java.library.path 中没有 ocijdbc12

java - 按 varchar 字段中存储的整数值对表进行排序

sql - 除了参数之外,SQL 中的 @ 符号是什么?

oracle - 如何在 PL-SQL 中创建参数化物化 View