代码之家  ›  专栏  ›  技术社区  ›  Jeremy

在Oracle的过程中重用select查询

  •  5
  • Jeremy  · 技术社区  · 14 年前

    如何存储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语句中,优化器会为我这样做吗?

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

    基本上,表1是一个标准表,ID是主键。而Table2有一个3列主键,ID是其中一列。在我的例子中,表2中的ID将显示在三行中。

    1 回复  |  直到 14 年前
        1
  •  7
  •   Vincent Malgrat    14 年前

    您可以使用SQL表对象来存储select的结果并重用它。它将消耗更多的内存,并且只有在第一次选择花费大量时间时才可能有效。

    CREATE TYPE tab_number IS TABLE OF NUMBER;
    /
    

    您可以将其与大容量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 存储中间结果集。