Повторно использовать запрос выбора в процедуре в Oracle - PullRequest
5 голосов
/ 23 марта 2010

Как мне сохранить результат оператора 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 появится в трех строках.

1 Ответ

7 голосов
/ 23 марта 2010

Вы можете использовать объект таблицы 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 для хранения промежуточного набора результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...