Вопрос или проблема
У меня есть следующая функция:
select POD
from get_error_rate_by_pod(:P26_REPORT_WEEK,:P26_ERROR_TYPE);
И мне нужно передать каждый результат из вышеуказанного запроса в следующую функцию в качестве второго параметра:
select *
from p49_get_data(:P26_REPORT_WEEK,POD,:P26_ERROR_TYPE);
И в основном “объединить” эти результаты вместе
Могу ли я сделать это с помощью запроса? Или мне нужно создать функцию с циклом + аккумулятором?
Я могу изменить вторую функцию, если это необходимо, чтобы она принимала серию PODS или регулярное выражение (что я бы не хотел), но надеюсь, что это не потребуется.
Ответ или решение
Вы можете объединить результаты двух функций в Oracle SQL, используя подзапросы и оператор UNION
. В данном случае вам нужно выполнить первый запрос, чтобы получить все значения POD, а затем передать каждое значение POD во второй запрос.
В данном решении мы будем использовать оператор CROSS JOIN
, чтобы проиллюстрировать, как можно "соединить" результаты первой функции с параметрами второй функции. Первый шаг – получить результаты из get_error_rate_by_pod
, а затем для каждого результата выполнить вызов второй функции p49_get_data
.
Пример SQL-запроса может выглядеть следующим образом:
SELECT *
FROM (
SELECT *
FROM p49_get_data(:P26_REPORT_WEEK, POD, :P26_ERROR_TYPE)
FROM get_error_rate_by_pod(:P26_REPORT_WEEK, :P26_ERROR_TYPE)
)
Однако, так как функция get_error_rate_by_pod
возвращает набор записей (состоящий из одной колонки POD), и мы хотим сделать выборку для каждого из этих значений, вам потребуется использовать конструкцию JOIN
, чтобы связать эти две функции. Мы можем использовать аналог OUTER JOIN
, если необходимо. Вот пример более подробного запроса:
SELECT d.*
FROM get_error_rate_by_pod(:P26_REPORT_WEEK, :P26_ERROR_TYPE) r
JOIN LATERAL (
SELECT *
FROM p49_get_data(:P26_REPORT_WEEK, r.POD, :P26_ERROR_TYPE)
) d ON 1=1
Обратите внимание на использование LATERAL
, который позволяет сослаться на результат предыдущего запроса (в данном случае, значение POD из первой функции) в подзапросе. Это решение очень эффективно для выполнения такой задачи и не затрагивает необходимость создания дополнительных функций или циклов.
Если ваша система Oracle не поддерживает LATERAL
, вы можете использовать обычные подзапросы:
SELECT *
FROM p49_get_data(:P26_REPORT_WEEK, POD, :P26_ERROR_TYPE)
WHERE POD IN (
SELECT POD
FROM get_error_rate_by_pod(:P26_REPORT_WEEK, :P26_ERROR_TYPE)
)
Этот пример подразумевает, что вы хотите получить все результаты из функции p49_get_data
, где POD содержится в результате функции get_error_rate_by_pod
. Этот подход хорошо работает, если количество данных не слишком велико.
Используя эти примеры, вы сможете эффективно "соединить" результаты двух функций в один запрос.