Я понимаю, что вы ищете OUTER JOIN
на pay_dir_cards_f
и что это происходит не так, как вы ожидаете.
Соединение в старом стиле и плохое форматирование затрудняют чтение запроса ... Когдапри сканировании вашего запроса на наличие части, которая относится к pay_dir_cards_f
условиям соединения, одно условие кажется проблематичным:
AND Trunc(SYSDATE) BETWEEN pdcf.effective_start_date AND pdcf.effective_end_date
Я подозреваю, что Oracle может выполнить OUTER JOIN
из-за (по крайней мере) этого условия,Существуют серьезные ограничения и предупреждения в отношении использования старых объединений, особенно OUTER JOIN
s, которые, например, описаны в руководстве по 10g .
Я настоятельно рекомендую переписать запросиспользовать не древние соединения.Это, вероятно, просто заставит вашу проблему исчезнуть.
В знак доброй воли найдите ниже первую попытку перестроить (и переформатировать) запрос.Вам нужно будет просмотреть его и, возможно, исправить несколько ошибок, но это должно быть неплохой отправной точкой:
SELECT DISTINCT
papf.person_number,
papf.effective_start_date,
papf.effective_end_date ,
paam.ASSIGNMENT_NUMBER
FROM
per_all_people_f papf
INNER JOIN per_all_assignments_m paam
ON paam.person_id = papf.person_id
AND paam.effective_latest_change = 'Y'
AND paam.assignment_type IN ( 'E', 'C' )
AND TRUNC(SYSDATE) BETWEEN paam.effective_start_date AND paam.effective_end_date
INNER JOIN pay_pay_relationships_dn pprd
ON pprd.person_id = papf.person_id
-- AND pprd.legislative_data_group_id = pldgv.legislative_data_group_id
AND pprd.payroll_stat_unit_id = paam.legal_entity_id
INNER JOIN pay_rel_groups_dn prgd
ON prgd.payroll_relationship_id = pprd.payroll_relationship_id
AND prgd.assignment_id = paam.assignment_id
AND prgd.group_type = 'A'
INNER JOIN pay_dir_cards_f pdcf
ON pdcf.payroll_relationship_id = prgd.payroll_relationship_id
AND TRUNC(SYSDATE) BETWEEN pdcf.effective_start_date AND pdcf.effective_end_date
LEFT JOIN pay_dir_card_components_f pdccf1
ON pdccf1.dir_card_id = pdcf.dir_card_id
AND pdccf1.dir_card_id = pdcf.dir_card_id
LEFT JOIN pay_dir_comp_details_f pdcdf1
ON TRUNC(SYSDATE) BETWEEN pdcdf1.effective_start_date AND pdcdf1.effective_end_date
AND pdcdf1.dir_card_comp_id = pdccf1.dir_card_comp_id
WHERE
SYSDATE BETWEEN papf.effective_start_date AND papf.effective_end_date
AND TRUNC(SYSDATE) BETWEEN papf.effective_start_date AND papf.effective_end_date
ORDER BY papf.person_number