Я почти уверен, что вы можете потерять отличные.
Когда вы используете UNION вместо UNION ALL, дублированные результаты отбрасываются.
Все зависит от того, насколько тяжелым является ваш встроенный запрос. Ключом к лучшей производительности будет выполнение только один раз, но это невозможно, учитывая данные, которые он возвращает.
Если вы сделаете это так:
select depfunctionid , functionid from Query
group by depfunctionid , functionid
Весьма вероятно, что вы получите повторные результаты для depfunctionid или functionid.
Я могу ошибаться, но мне кажется, что вы пытаетесь получить дерево зависимостей. Если бы это было так, я лично попытался бы использовать подход материализованного пути.
Если материализованный путь хранится в имени таблицы, ссылающейся на себя, я бы извлек дерево, используя что-то вроде
select asrt2.function_id
from a_self_referencig_table asrt1,
a_self_referencig_table asrt2
where asrt1.function_name = 'blah function'
and asrt2.materialized_path like (asrt1.materialized_path || '%')
order by asrt2.materialized_path, asrt2.some_child_node_ordering_column
Это позволит получить все дерево в правильном порядке. Отстойно то, что необходимо создать материализованный путь на основе function_id и parent_function_id (или, в вашем случае, functionid и depfunctionid), но триггер может довольно легко об этом позаботиться.