微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在Oracle的过程中重用选择查询

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

解决方法

我将如何存储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将显示在三行中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。