Если ваши списки IN
идентичны, вы можете использовать UNPIVOT
, затем GROUP BY
и ORDER BY
и затем фильтровать по WHERE ROWNUM = 1
после заказа.
Это означает, что вам нужно только написать списки один раз (что облегчает отладку и обслуживание запроса) и Oracle нужно только один раз отсканировать таблицу / индекс AIR_INFO
(тогда как UNION
может использовать два сканирования).
SELECT *
FROM (
SELECT value AS air_arb,
COUNT(*)
FROM AIR_INFO
UNPIVOT ( value FOR type IN ( AIR_ARB, AIR_MAT ) )
WHERE V_VX IN (910208,910209)
AND V_Y IN (826369,826370)
GROUP BY value
ORDER BY COUNT(*) DESC
)
WHERE rownum = 1;
Итак для тестовых данных:
CREATE TABLE air_info ( v_vx, v_y, air_arb, air_mat ) AS
SELECT 910208, 826369, 1, 2 FROM DUAL UNION ALL
SELECT 910209, 826370, 3, 2 FROM DUAL;
это выводит:
AIR_ARB | COUNT(*)
------: | -------:
2 | 2
db <> Fiddle здесь