Поскольку объединение поддерживает все на уровне SQL, оно должно быть лучшим выбором.
Использование функции - PL / SQL - вызывает переключение контекста (с SQL на PL / SQL и обратно на SQL на PL / SQL ...), что будет брать ресурсы.
Вы ничего не заметите, если есть небольшой набор данных, но - поскольку количество задействованных строк становится больше, время выполнения, вероятно, пострадает во втором варианте.
Если вы будете тестировать его, запустите каждый вариант несколько раз из-за возможного кэширования.