В коррелированном подзапросе Oracle SQL
Мне нужно, чтобы в подзапросе было условие для получения ровно одной строки (если строк больше, он не должен получать никаких строк).
И приведенный ниже запрос работает нормально. Но для этого нужно дважды запрашивать одну и ту же таблицу.
SELECT m.pk_1
,m.pk_2
,m.fld_3
,(SELECT c.pk_1
FROM child_tab c
WHERE (SELECT COUNT(*)
FROM child_tab c2
WHERE c2.pk_1 = m.pk_1
AND rownum <= 2) = 1
AND c.pk_1 = m.pk_1) c_pk_1
FROM master_tab m
WHERE m.pk_1 = '018'
AND m.pk_2 = 'value'
Изменив подзапрос с использованием аналитической функции, приведенный ниже запрос дает ошибку
SELECT m.pk_1
,m.pk_2
,m.fld_3
,(SELECT ch.pk_1
FROM (SELECT COUNT(*) over() cnt
,c.pk_1
FROM child_tab c
WHERE c.pk_1 = m.pk_1
AND rownum <= 2) ch
WHERE cnt = 1
AND c.pk_1 = m.pk_1) c_pk_1
FROM master_tab m
WHERE m.pk_1 = '018'
AND m.pk_2 = 'value'
ORA-00904 m.pk_1 is an invalid identifier
Есть ли лучший способ сделать это с помощью Oracle SQL?
ОБНОВЛЕНИЕ
Мое реальное требование состоит в том, чтобы я генерировал этот SQL как процесс рекурсии, который ведет к многим подобным уровням. И выбранные мной данные не будут ограничиваться ключом. И мне нужно только решение SQL, поэтому PLSQL - это не выбор.