Я думаю, что вы могли бы осуществить это с объединением:
SELECT TB1.COL3
FROM TB1, TB2
WHERE TB1.COL1 = TB2.Col1
AND TB2.COL1 = '12345'
AND (TB2.COL3 = COALESCE((SELECT MIN(TB3.COL4)
FROM TB3
WHERE COL1 = TB2.COL1
AND COL2 in ('A', 'B')
AND COL4 IN (SELECT COL3 FROM TB2
WHERE COL1 = TB2.COL1)), TB2.COL3))
AND ROWNUM = 1;
Здесь мы просто оборачиваем этот оператор SELECT в COALESCE
, который, если он возвращает ноль, вместо этого получит значение второго параметра,это тот же столбец, который мы сравниваем.Поскольку TB2.COL3 = TB2.COL3
, очевидно, равно TRUE
, этот фильтр не окажет никакого влияния на набор результатов.
Кроме того, обычно рекомендуется прекратить использовать запятые в предложении FROM и использовать правильный синтаксис JOIN.Он существует уже более 2 десятилетий:
SELECT
TB1.COL3
FROM
TB1
INNER JOIN TB2
ON TB1.COL1 = TB2.Col1
WHERE
TB2.COL1 = '12345'
AND
(
TB2.COL3 = COALESCE
(
(
SELECT
MIN(TB3.COL4)
FROM
TB3
WHERE
COL1 = TB2.COL1
AND COL2 in ('A', 'B')
AND COL4 IN
(
SELECT
COL3
FROM
TB2
WHERE
COL1 = TB2.COL1
)
),
TB2.COL3
)
)
AND ROWNUM = 1;