Запрос Select повторного использования в процедуре в Oracle

Как я сохранил бы результат избранного оператора, таким образом, я могу снова использовать результаты с 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 является стандартной таблицей с идентификатором, являющимся первичным ключом. В то время как table2 имеет первичный ключ на 3 столбца с идентификатором, являющимся одним из тех столбцов. В моем случае идентификатор в table2 появится в трех строках.

6
задан Jeremy 23 March 2010 в 16:40
поделиться

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));

В качестве альтернативы вы можете использовать ГЛОБАЛЬНУЮ ВРЕМЕННУЮ ТАБЛИЦУ для хранения промежуточного набора результатов.

7
ответ дан 17 December 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: