внешнее соединение по подзапросу в состоянии не работает - PullRequest
0 голосов
/ 01 октября 2019

Я использую приведенный ниже запрос, чтобы получить несколько столбцов. Теперь, если данные в таблице cs равны нулю, я все еще хочу получить все значения. Внешнее объединение работает нормально, но, поскольку у меня есть условие (select max(date_From) from cmp_Salary cs1 where cs1.assignment_id = cs.assignment_id), сотрудники с таблицей CS, не имеющие никакого значения, не получают. Как я могу использовать NVL на этом max(data_from), чтобы я мог получить значение из этой таблицы, когда оно равно нулю, и когда есть значение в таблице cs, это условие проверено?

   select (CASE when PAAM.action_code = 'GLB_TRANSFER' then to_char(paam.effective_start_date,'YYYY-MM-DD') ELSE to_char(papf.START_DATE,'YYYY-MM-DD') END) "Hire_Date"
    ,to_char(PPS.DATE_START,'YYYY-MM-DD') "PPS Start Date"
    ,papf.person_number "Person_Number"
    ,to_char(paam.effective_start_date,'YYYY-MM-DD')   "effective Start Date"
    ,paam.EFFECTIVE_SEQUENCE "Effective Sequence"
    ,paam.EFFECTIVE_LATEST_CHANGE "Effective Latest Change"
    ,paam.assignment_number "Assignment_Number"
    ,paam.action_code "Action_Code"
    ,(select haou.name
    from hr_all_organization_units haou
    where haou.organization_id = paam.LEGAL_ENTITY_ID) "Legal_Emp",
    csbt.SALARY_BASIS_NAME "Salary_Basis",
    to_char(cs.date_From,'YYYY-MM-DD') "Salary_Start_Date",
    cs.salary_amount "Salary_Amount",

    cs.currency_code new_curr_Code,
    (Case cs.currency_code
    when 'CAD' then '2019-07-28'
    else '2019-08-05'
    end) new_dt,
    (case csbt.SALARY_BASIS_NAME
    when 'CA Salary' then (cs.salary_amount*12)
    when 'CA Salary No Time' then (cs.salary_amount*12)
    else cs.salary_amount
    end) new_amt
    --cs.salary_amount new_amt
    From per_all_people_f papf,
    per_all_assignments_m paam,
    cmp_salary cs,
    CMP_SALARY_BASES_TL csbt,
    PER_PERIODS_OF_SERVICE PPS
    where papf.person_id = paam.person_id
    and paam.assignment_id = cs.assignment_id(+)
    and cs.SALARY_BASIS_ID = csbt.SALARY_BASIS_ID(+)
    AND     PAAM.PRIMARY_FLAG              = 'Y' 
    AND     PAAM.EFFECTIVE_LATEST_CHANGE   = 'Y' 
    AND     PAAM.assignment_type in ('C','E')
    and sysdate BETWEEN PAAM.EFFECTIVE_START_DATE AND PAAM.EFFECTIVE_END_DATE
    and sysdate BETWEEN PAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE
    and cs.date_from = nvl((select max(date_From) from cmp_Salary cs1 where cs1.assignment_id = cs.assignment_id),cs.date_from )
    and csbt.language = 'US'
    and paam.ASSIGNMENT_STATUS_TYPE='ACTIVE'
    and PPS.PERSON_ID=papf.PERSON_ID
    and PPS.PERIOD_OF_SERVICE_ID=paam.PERIOD_OF_SERVICE_ID
    and papf.person_number in '1755'
    order by 1

1 Ответ

1 голос
/ 01 октября 2019

Вам необходимо переместить этот внутренний запрос из предложения.

Также используйте соединения в стиле ANSI. (Рекомендуется)

From per_all_people_f papf,
    per_all_assignments_m paam,
    cmp_salary cs,
    CMP_SALARY_BASES_TL csbt,
    PER_PERIODS_OF_SERVICE PPS,
    -- added below inner view
    (select max(date_From) as date_from, assignment_id 
     from cmp_Salary 
     group by assignment_id) cs1
    where papf.person_id = paam.person_id
    and paam.assignment_id = cs.assignment_id(+)
    and cs.SALARY_BASIS_ID = csbt.SALARY_BASIS_ID(+)
    AND     PAAM.PRIMARY_FLAG              = 'Y' 
    AND     PAAM.EFFECTIVE_LATEST_CHANGE   = 'Y' 
    AND     PAAM.assignment_type in ('C','E')
    and sysdate BETWEEN PAAM.EFFECTIVE_START_DATE AND PAAM.EFFECTIVE_END_DATE
    and sysdate BETWEEN PAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE
    And paam.assignment_id = cs1.assignment_id(+) -- added this
    and cs.date_from = cs1.date_from(+) -- added this
    and csbt.language = 'US'
    and paam.ASSIGNMENT_STATUS_TYPE='ACTIVE'
    and PPS.PERSON_ID=papf.PERSON_ID
    and PPS.PERIOD_OF_SERVICE_ID=paam.PERIOD_OF_SERVICE_ID
    and papf.person_number in '1755'
    order by 1

- Обновление -

Преобразование объединений в стандарт ANSI и изменение способа доступа к данным из таблицы: CMP_SALARY,

Пожалуйста, уточните следующий запрос:

FROM
    PER_ALL_PEOPLE_F PAPF
    JOIN PER_ALL_ASSIGNMENTS_M PAAM ON ( PAPF.PERSON_ID = PAAM.PERSON_ID )
    JOIN PER_PERIODS_OF_SERVICE PPS ON ( PPS.PERSON_ID = PAPF.PERSON_ID
                                         AND PPS.PERIOD_OF_SERVICE_ID = PAAM.PERIOD_OF_SERVICE_ID )
    LEFT JOIN (
        SELECT
            ASSIGNMENT_ID,
            DATE_FROM,
            SALARY_AMOUNT,
            CURRENCY_CODE,
            SALARY_BASIS_ID,
            ROW_NUMBER() OVER(
                PARTITION BY ASSIGNMENT_ID
                ORDER BY
                    DATE_FROM DESC NULLS LAST
            ) AS RN
        FROM
            CMP_SALARY
    ) CS ON ( PAAM.ASSIGNMENT_ID = CS.ASSIGNMENT_ID
              AND CS.RN = 1 )
    LEFT JOIN CMP_SALARY_BASES_TL CSBT ON ( CS.SALARY_BASIS_ID = CSBT.SALARY_BASIS_ID )
WHERE
    PAAM.PRIMARY_FLAG = 'Y'
    AND PAAM.EFFECTIVE_LATEST_CHANGE = 'Y'
    AND PAAM.ASSIGNMENT_TYPE IN (
        'C',
        'E'
    )
    AND SYSDATE BETWEEN PAAM.EFFECTIVE_START_DATE AND PAAM.EFFECTIVE_END_DATE
    AND SYSDATE BETWEEN PAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE
    AND CSBT.LANGUAGE = 'US'
    AND PAAM.ASSIGNMENT_STATUS_TYPE = 'ACTIVE'
    AND PAPF.PERSON_NUMBER IN '1755'
ORDER BY
    1

Cheers !!

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