Как я сохранил бы результат избранного оператора, таким образом, я могу снова использовать результаты с 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 появится в трех строках.
Вы можете использовать объект таблицы 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));
В качестве альтернативы вы можете использовать ГЛОБАЛЬНУЮ ВРЕМЕННУЮ ТАБЛИЦУ для хранения промежуточного набора результатов.