ORA-00913 - сообщение об ошибке «слишком много значений» при коррелированном запросе - PullRequest
0 голосов
/ 30 августа 2018

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

  (
    SELECT *
    FROM (
      SELECT DISTINCT JIN.TITLE,
        RANK () OVER (PARTITION BY EIN.PI_CANDIDATE_NUM
          ORDER BY EIN.PI_HIS_ITM_APP_TRK_CREATION_DT DESC) AS ROWRANK
      FROM WC_HIRED_INTERNS_FA HIN
      INNER JOIN WC_APPLICATION_EVENT_F EIN
      ON HIN.PI_CANDIDATE_NUM = EIN.PI_CANDIDATE_NUM
      INNER JOIN WC_JOB_INFORMATION_D JIN
      ON EIN.JOB_INFO_ROW_WID  = JIN.ROW_WID
      WHERE EIN.PI_HIS_ITM_APP_TRK_STS_NAME = 'Hired - External'
      AND EIN.PI_HIS_ITM_APP_TRK_STEP_NAME = 'Hire'
      AND JIN.JOB_FAMILY_NAME IN ('MDP', 'ELP', 'Emerging Leader Program', 'Other')
      AND JIN.TITLE  NOT IN ('Student Ambassador Program for Eligible Summer Interns',
        'Student Ambassador')
      AND  HIN.PI_CANDIDATE_NUM = H.PI_CANDIDATE_NUM
    ) ac
    where ROWRANK = 1 
  ) AS ACCEPTEDTITLE

Полный код после попытки применить предложение Алексея:

SELECT DISTINCT H.PI_CANDIDATE_NUM,
  H.PARENT_PI_NUMBER,
  H.ASSOCIATE_NAME,
  J.JOB_FAMILY_NAME,
  J.ORGANIZATION_NAME,
  J.TITLE,
  E.CONTEST_NUMBER,
  E.PI_HIS_ITM_APP_TRK_CREATION_DT OFFER_DATE,
  (
    SELECT JIN.TITLE
    FROM (
      SELECT DISTINCT RANK () OVER (PARTITION BY EIN.PI_CANDIDATE_NUM
        ORDER BY EIN.PI_HIS_ITM_APP_TRK_CREATION_DT DESC) AS ROWRANK
      FROM WC_HIRED_INTERNS_FA HIN
      INNER JOIN WC_APPLICATION_EVENT_F EIN ON HIN.PI_CANDIDATE_NUM = EIN.PI_CANDIDATE_NUM
      INNER JOIN WC_JOB_INFORMATION_D JIN ON EIN.JOB_INFO_ROW_WID = JIN.ROW_WID
      WHERE JIN.JOB_FAMILY_NAME IN ('MDP', 'ELP', 'Emerging Leader Program', 'Other')
      AND EIN.PI_HIS_ITM_APP_TRK_STS_NAME = 'Hired - External'
      AND EIN.PI_HIS_ITM_APP_TRK_STEP_NAME = 'Hire'
      AND JIN.TITLE NOT IN ('Student Ambassador Program for Eligible Summer Interns',
        'Student Ambassador')
      AND HIN.PI_CANDIDATE_NUM = H.PI_CANDIDATE_NUM
    ) ac
    where ROWRANK = 1
  ) AS ACCEPTEDTITLE
FROM WC_HIRED_INTERNS_FA H
INNER JOIN WC_APPLICATION_EVENT_F E ON H.PI_CANDIDATE_NUM = E.PI_CANDIDATE_NUM
INNER JOIN WC_JOB_INFORMATION_D J ON E.JOB_INFO_ROW_WID = J.ROW_WID
WHERE E.PI_HIS_ITM_APP_TRK_CREATION_DT IN (
  SELECT DISTINCT E.PI_HIS_ITM_APP_TRK_CREATION_DT --limit 1
  FROM WC_APPLICATION_EVENT_F E
  INNER JOIN WC_HIRED_INTERNS_FA H ON H.PI_CANDIDATE_NUM = E.PI_CANDIDATE_NUM
  INNER JOIN WC_JOB_INFORMATION_D J ON E.JOB_INFO_ROW_WID = J.ROW_WID
  WHERE J.JOB_FAMILY_NAME IN ('MDP', 'ELP', 'Emerging Leader Program', 'Other')
  AND E.PI_HIS_ITM_APP_TRK_STS_NAME = 'Extended'
  AND E.PI_HIS_ITM_APP_TRK_STEP_NAME = 'Offer'
  AND J.TITLE NOT IN ('Student Ambassador Program for Eligible Summer Interns',
    'Student Ambassador')
);

1 Ответ

0 голосов
/ 30 августа 2018

Как сказал Алексей в комментарии, вам нужно изменить * на title; основываясь на ваших последующих комментариях, вы, кажется, полностью удалили ссылку jin.title из внутреннего запроса и оставили префикс.

Так что вместо

  (
    SELECT *
    FROM (
      SELECT DISTINCT JIN.TITLE,
        RANK () OVER (PARTITION BY EIN.PI_CANDIDATE_NUM
          ORDER BY EIN.PI_HIS_ITM_APP_TRK_CREATION_DT DESC) AS ROWRANK
...
    ) ac
    where ROWRANK = 1 
  ) AS ACCEPTEDTITLE

или ваша измененная версия:

  (
    SELECT JIN.TITLE
    FROM (
      SELECT DISTINCT RANK () OVER (PARTITION BY EIN.PI_CANDIDATE_NUM
        ORDER BY EIN.PI_HIS_ITM_APP_TRK_CREATION_DT DESC) AS ROWRANK
...
    ) ac
    where ROWRANK = 1
  ) AS ACCEPTEDTITLE

вам нужно:

  (
    SELECT TITLE
    FROM (
      SELECT DISTINCT
        JIN.TITLE,
        RANK () OVER (PARTITION BY EIN.PI_CANDIDATE_NUM
          ORDER BY EIN.PI_HIS_ITM_APP_TRK_CREATION_DT DESC)AS ROWRANK
...
    ) ac
    where ROWRANK = 1 
) AS ACCEPTEDTITLE

Я прокомментировал ваши предыдущие вопросы, которые, как мне кажется, требуют повторного анализа и упрощения использования вами подзапросов и повторного кода. Использование DISTINCT часто свидетельствует о том, что что-то не так.


Вы все еще не предоставили MCVE, но с несколькими предположениями о том, что вы делаете, и о ваших данных, похоже, вы хотите что-то вроде:

select h.pi_candidate_num,
  h.parent_pi_number,
  h.associate_name,
  j.job_family_name,
  j.organization_name,
  j.title,
  e.contest_number,
  max(case when e.pi_his_itm_app_trk_sts_name = 'Extended'
            and e.pi_his_itm_app_trk_step_name = 'Offer'
           then e.pi_his_itm_app_trk_creation_dt end) as offer_date,
  max(case when e.pi_his_itm_app_trk_sts_name = 'Hired - External'
            and e.pi_his_itm_app_trk_step_name = 'Hire'
           then e.pi_his_itm_app_trk_creation_dt end) as accepted_title,
  max(case when e.pi_his_itm_app_trk_sts_name = 'Hired - External'
            and e.pi_his_itm_app_trk_step_name = 'Hire'
           then e.pi_his_itm_app_trk_creation_dt end) as hire_date
from wc_hired_interns_fa h
join wc_application_event_f e on h.pi_candidate_num = e.pi_candidate_num
join wc_job_information_d j on e.job_info_row_wid = j.row_wid
where j.job_family_name in ('MDP', 'ELP', 'Emerging Leader Program', 'Other')
and (
 (e.pi_his_itm_app_trk_sts_name = 'Extended'
  and e.pi_his_itm_app_trk_step_name = 'Offer')
 or (e.pi_his_itm_app_trk_sts_name = 'Hired - External'
  and e.pi_his_itm_app_trk_step_name = 'Hire')
)
and j.title not in ('Student Ambassador Program for Eligible Summer Interns',
  'Student Ambassador')
group by h.pi_candidate_num,
  h.parent_pi_number,
  h.associate_name,
  j.job_family_name,
  j.organization_name,
  j.title,
  e.contest_number;

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

Не проверено, конечно, но может указать вам новое направление, чтобы получить то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...