外部联接不起作用,仅查询中需要Null列

问题描述 投票:0回答:2

我创建了以下查询,以查找表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
sql oracle
2个回答
0
投票

未经测试:

我不确定您想为系统日期使用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

0
投票

最明显的问题是以下行中缺少(+)

© www.soinside.com 2019 - 2024. All rights reserved.