Как передать значение столбца основного запроса во вложенный подзапрос Где условие? - PullRequest
0 голосов
/ 07 мая 2019

Я пишу этот запрос с вложенным подзапросом, чтобы найти PREPARED_BY, VERIFIED_BY, AUTHORIZED_BY в зависимости от CONDATE из Expenditure таблицы, но в моем подзапросе объект таблицы Expenditure CONDATE имеет видне распознается и выдает эту ошибку:

ORA-00904: "EX". "CONDATE": неверный идентификатор.

Код:

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 prepared_by
        FROM   (SELECT prepared_by
                FROM   authorization
                WHERE  (pre_last_date >= ex.condate OR pre_last_date IS NULL)
                AND    project_id = 128
                ORDER  BY id ASC)
        WHERE  rownum = 1) AS prepared_by,
       (SELECT verified_by
        FROM   (SELECT verified_by
                FROM   authorization
                WHERE  (ve_last_date >= ex.condate OR ve_last_date IS NULL)
                AND    project_id = 128
                ORDER  BY id ASC)
        WHERE  rownum = 1) AS verified_by,
       (SELECT authorized_by
        FROM   (SELECT authorized_by
                FROM   authorization
                WHERE  (au_last_date >= ex.condate OR au_last_date IS NULL)
                AND    project_id = 128
                ORDER  BY id ASC)
        WHERE  rownum = 1) AS 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;

1 Ответ

1 голос
/ 07 мая 2019

Проблема, с которой вы сталкиваетесь, заключается в том, что на родительскую таблицу может ссылаться только подзапрос на один уровень ниже. Вы пытаетесь получить доступ к столбцам из родительской таблицы в подзапросе на два уровня ниже, поэтому и возникает ошибка.

Чтобы получить доступ к родительскому столбцу в вашем подзапросе, вам нужно переписать его так, чтобы он был только на один уровень ниже.

Этого можно достичь, используя агрегатную функцию 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 для самого низкого идентификатора.

...