ORA-00913: слишком много значений в подзапросе Oracle - PullRequest
0 голосов
/ 29 августа 2018

У меня есть требование собрать все предложения о работе, выданные кандидату, и какую кандидатуру в конце концов наняли. Я создал два отдельных запроса, один из которых захватывает все предложения, а подзапрос - только те задания, в которые каждый кандидат был окончательно нанят. Проблема, когда я объединяю два запроса, я получаю ORA-00913: слишком много значений. Есть предложения?

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
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
        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'))
AND    j.title IN (SELECT *
                   FROM   (SELECT DISTINCT j.title full_time_detail,
                                           rank() over(PARTITION BY e.pi_candidate_num ORDER BY e.pi_his_itm_app_trk_creation_dt DESC) AS rowrank
                           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
                           AND    j.job_family_name IN ('MDP', 'ELP', 'Emerging Leader Program', 'Other')
                           AND    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'))
                   WHERE  rowrank = 1);

1 Ответ

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

Непосредственной проблемой, кажется, является эта часть:

...
  AND J.TITLE IN (
    SELECT * FROM (
      SELECT DISTINCT J.TITLE FULL_TIME_DETAIL,
        RANK () OVER (PARTITION BY E.PI_CANDIDATE_NUM ORDER BY E.PI_HIS_ITM_APP_TRK_CREATION_DT DESC) AS ROWRANK 
        FROM WC_HIRED_INTERNS_FA H
...

SELECT * означает, что подзапрос возвращает два значения столбца, FULL_TIME_DETAIL и ROWRANK. Вы на самом деле не хотите там ROWRANK, поэтому замените * на нужный вам столбец:

...
  AND J.TITLE IN (
    SELECT FULL_TIME_DETAIL FROM (
      SELECT DISTINCT J.TITLE FULL_TIME_DETAIL,
        RANK () OVER (PARTITION BY E.PI_CANDIDATE_NUM ORDER BY E.PI_HIS_ITM_APP_TRK_CREATION_DT DESC) AS ROWRANK 
        FROM WC_HIRED_INTERNS_FA H
...

Вы выполняете много подзапросов и повторяете много кода, так что это может быть значительно упрощено; возможно исследовать аналитические функции. Это, однако, выходит за рамки этого вопроса и конкретной ошибки.

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