Наиболее очевидной проблемой является отсутствие (+)
в следующей строке:
AND POPM.org_payment_method_id(+) = PPPM.org_payment_method_id
Это должно читаться как
AND POPM.org_payment_method_id(+) = PPPM.org_payment_method_id(+)
, потому что вы пытаетесь (на основедругая информация в запросе) к внешнему объединению в таблице PAY_PERSON_PAY_METHODS_F, а отсутствие завершающего (+)
для второго значения в этом сравнении приводит к эффективному преобразованию объединения во внутреннее объединение.
Действительно, вам нужно изучить соединения ANSI "нового стиля". Они были всего лишь 29 лет - я думаю, можно с уверенностью сказать, что они не просто причуда. : -)
Если вы переформатируете запрос, чтобы избавиться от подразумеваемых объединений, вы получите что-то вроде:
SELECT DISTINCT p.PERSON_NUMBER,
paaf.ASSIGNMENT_NUMBER,
PAYROLL_RELATIONSHIP_NUMBER,
pppm.PERCENTAGE,
pppm.PRIORITY,
popm.ORG_PAYMENT_METHOD_NAME,
pppm.NAME,
TO_CHAR(pppm.EFFECTIVE_START_DATE, 'DD-MM-YYYY')
p.EFFECTIVE_START_DATE,
pppm.PAYMENT_AMOUNT_TYPE,
pppm.AMOUNT
FROM PER_ALL_PEOPLE_F p
INNER JOIN PAY_PAY_RELATIONSHIPS_DN ppr
ON ppr.PERSON_ID = p.PERSON_ID AND
TRUNC(SYSDATE) BETWEEN ppr.START_DATE
AND ppr.END_DATE
INNER JOIN PER_ALL_ASSIGNMENTS_M paaf
ON paaf.PERSON_ID = p.PERSON_ID AND
paaf.EFFECTIVE_LATEST_CHANGE = 'Y' AND
paaf.ASSIGNMENT_STATUS_TYPE LIKE 'ACTIVE%' AND
paaf.ASSIGNMENT_TYPE NOT LIKE '%T%' AND
TRUNC(SYSDATE) BETWEEN paaf.EFFECTIVE_START_DATE
AND paaf.EFFECTIVE_END_DATE
LEFT OUTER JOIN PAY_PERSON_PAY_METHODS_F pppm
ON pppm.PAYROLL_RELATIONSHIP_ID = ppr.PAYROLL_RELATIONSHIP_ID AND
TRUNC(SYSDATE) BETWEEN pppm.EFFECTIVE_START_DATE
AND pppm.EFFECTIVE_END_DATE
LEFT OUTER JOIN PAY_ORG_PAY_METHODS_VL popm
ON popm.ORG_PAYMENT_METHOD_ID = PPPM.ORG_PAYMENT_METHOD_ID AND
TRUNC(SYSDATE) BETWEEN popm.EFFECTIVE_START_DATE
AND popm.EFFECTIVE_END_DATE
WHERE TRUNC(SYSDATE) BETWEEN p.EFFECTIVE_START_DATE
AND p.EFFECTIVE_END_DATE AND
popm.ORG_PAYMENT_METHOD_NAME IS NULL
ORDER BY p.PERSON_NUMBER