我创建了以下查询,以查找表pay_person_pay_methods_f中不存在的员工并且使用条件ORG_PAYMENT_METHOD_NAME的pay_org_pay_methods_vl为零。我为此使用了旧的外部联接,因为我不熟悉新联接,而新联接给我错误。
下面的查询为我提供了更多数据……即使ORG_PAYMENT_METHOD_NAME的值不为空,也正在此查询中获取。我可以对此进行哪些更改以提供充分的证据?
select * from
(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')
Effective_start_date,
pppm.payment_amount_type,
PPPM.amount
FROM per_all_people_f p,
pay_pay_relationships_dn ppr,
pay_person_pay_methods_f pppm,
per_all_assignments_m paaf,
pay_org_pay_methods_vl POPM
WHERE p.person_id = ppr.person_id
AND paaf.assignment_type NOT LIKE '%T%'
AND paaf.person_id = p.person_id
AND PAAF.EFFECTIVE_LATEST_CHANGE = 'Y'
AND paaf.assignment_status_type LIKE 'ACTIVE%'
AND Trunc(sysdate) BETWEEN paaf.effective_start_date AND
paaf.effective_end_date
AND POPM.org_payment_method_id(+) = PPPM.org_payment_method_id
AND ppr.payroll_relationship_id = pppm.payroll_relationship_id(+)
AND Trunc(sysdate) BETWEEN p.effective_start_date AND
p.effective_end_date
AND Trunc(sysdate) BETWEEN ppr.start_date AND ppr.end_date
AND Trunc(sysdate) BETWEEN POPM.effective_start_date(+) AND
POPM.effective_end_date(+)
AND Trunc(sysdate) BETWEEN pppm.effective_start_date(+) AND
pppm.effective_end_date(+)
)
where ORG_PAYMENT_METHOD_NAME is null
order by person_number
未经测试:
我不确定您想为系统日期使用POPM和PPPM上的(+)...
不是(+)表示所有记录,因此使其成为外部联接,这可能导致您获取比期望更多的记录,因为实际上它会包括所有POPM或所有PPPM记录,我想您只想要所有per_all_people?] >
我相信这是新格式的SQL ...
SELECT *
FROM (
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')
Effective_start_date,
pppm.payment_amount_type,
PPPM.amount
FROM per_all_people_f p
LEFT JOIN pay_pay_relationships_dn ppr
on p.person_id = ppr.person_id
AND Trunc(sysdate) BETWEEN p.effective_start_date AND p.effective_end_date
AND Trunc(sysdate) BETWEEN ppr.start_date AND ppr.end_date
LEFT JOIN pay_person_pay_methods_f pppm
on ppr.payroll_relationship_id = pppm.payroll_relationship_id
AND Trunc(sysdate) BETWEEN pppm.effective_start_date AND pppm.effective_end_date
LEFT JOIN per_all_assignments_m paaf
ON paaf.person_id = p.person_id
AND paaf.assignment_type NOT LIKE '%T%'
AND PAAF.EFFECTIVE_LATEST_CHANGE = 'Y'
AND paaf.assignment_status_type LIKE 'ACTIVE%'
AND Trunc(sysdate) BETWEEN paaf.effective_start_date AND paaf.effective_end_date
LEFT 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 ORG_PAYMENT_METHOD_NAME is null
ORDER BY person_number
最明显的问题是以下行中缺少(+)
: