Проблема, с которой вы сталкиваетесь, заключается в том, что на родительскую таблицу может ссылаться только подзапрос на один уровень ниже. Вы пытаетесь получить доступ к столбцам из родительской таблицы в подзапросе на два уровня ниже, поэтому и возникает ошибка.
Чтобы получить доступ к родительскому столбцу в вашем подзапросе, вам нужно переписать его так, чтобы он был только на один уровень ниже.
Этого можно достичь, используя агрегатную функцию KEEP FIRST/LAST
, например ::100100
SELECT ex.conno,
ex.itemno,
ex.adv_no || ' ' || to_char(ex.condate, 'DD-MON-YYYY') chequenodate,
ex.conname,
ex.apaid,
ex.dpayment,
gf.gf_name,
expenditure_type,
ex.off_code,
ofc.officename,
ex.remarks,
(SELECT MAX(a.prepared_by) KEEP (dense_rank FIRST ORDER BY a.id ASC)
FROM authorizatiion a
WHERE (a.pre_last_date >= ex.condate OR a.pre_last_date IS NULL)
AND a.project_id = 128) prepared_by,
(SELECT MAX(a.verified_by) KEEP (dense_rank FIRST ORDER BY a.id ASC)
FROM authorizatiion a
WHERE (a.ve_last_date >= ex.condate OR a.ve_last_date IS NULL)
AND a.project_id = 128) verified_by,
(SELECT MAX(a.authorized_by) KEEP (dense_rank FIRST ORDER BY a.id ASC)
FROM authorizatiion a
WHERE (a.au_last_date >= ex.condate OR a.au_last_date IS NULL)
AND a.project_id = 128) authorized_by
FROM expenditure ex
INNER JOIN officecode ofc ON ofc.off_code = ex.off_code
INNER JOIN coa_category ca ON ca.coa_cat_id = ex.coa_cat_id
INNER JOIN g_fund_type gf ON gf.gf_type_id = ca.gf_type_id
WHERE ex.conno = 'MGSP/PMU/NON/145'
AND ex.itemno = 149;
N.B. Я использовал MAX
и FIRST
здесь; это означает, что если имеется несколько строк с одинаковым наименьшим идентификатором, будет использовано наибольшее значение столбца prepare_by. Вы можете изменить это значение на MIN
, если хотите минимальное значение. Это актуально, только если у вас есть более одной строки на один идентификатор, в противном случае он просто возвращает значение столбца prepare_by для самого низкого идентификатора.