Sql 从查询中检索单行

Sql 从查询中检索单行,sql,oracle,plsql,Sql,Oracle,Plsql,我正在创建一个查询,以查找日期为'31-dec-4712'(最新)的员工的薪资详细信息。 但是,如果一名员工的两行日期为4712年12月31日,则在其他情况下,仅当 然后会出现应按原样返回的单行 我已经创建了以下薪资详细信息查询。需要以上场景的帮助吗 select distinct PAPF.EMPLOYEE_NUMBER , TO_CHAR (EMP_DOJ (PAPF.PERSON_ID),'DD-MON-YYYY' ) DOJ ,

我正在创建一个查询,以查找日期为'31-dec-4712'(最新)的员工的薪资详细信息。 但是,如果一名员工的两行日期为4712年12月31日,则在其他情况下,仅当 然后会出现应按原样返回的单行

我已经创建了以下薪资详细信息查询。需要以上场景的帮助吗

select distinct PAPF.EMPLOYEE_NUMBER ,
                TO_CHAR (EMP_DOJ (PAPF.PERSON_ID),'DD-MON-YYYY' ) DOJ ,
                TO_CHAR(HR_EMPLOYEE_ORIGINAL_DOJ(PAPF.EMPLOYEE_NUMBER,42) ,'DD-     MON-YYYY' ) ORIGINAL_DOJ,
                PPP.CHANGE_DATE,
                PPP.DATE_TO,
                PPP.PROPOSED_SALARY_N TOTAL_REMUN,
                HR_GENERAL.DECODE_LOOKUP('PER_SAL_PROPOSAL_STATUS',APPROVED) status
from PER_ALL_ASSIGNMENTS_F PAAF,
     PER_ALL_PEOPLE_F PAPF,
     PER_PAY_PROPOSALS PPP
where 1                        = 1
and PAPF.PERSON_ID             = PAAF.PERSON_ID
and PAPF.BUSINESS_GROUP_ID     = 21
and PAPF.CURRENT_EMPLOYEE_FLAG = 'Y'
and papf.employee_number       = '109575'
and :P_DATE1 between PAAF.EFFECTIVE_START_DATE
                 and PAAF.EFFECTIVE_END_DATE
and :P_DATE1 between PAPF.EFFECTIVE_START_DATE
                 and PAPF.EFFECTIVE_END_DATE
and :P_DATE1 between PPP.CHANGE_DATE(+)
                 and NVL(PPP.DATE_TO, HR_GENERAL.END_OF_TIME)
and PPP.ASSIGNMENT_ID(+) = PAAF.ASSIGNMENT_ID
order by TO_NUMBER(PAPF.EMPLOYEE_NUMBER);


Emp_num  DOJ             ORIGINAL_DOJ   CHANGE_DATE      DATE_TO      TOTAL_REMUN  STATUS
109575  01-DEC-2016 24-JUL-2014 01-MAY-19   31-DEC-12   250000    Proposed
109575  01-DEC-2016 24-JUL-2014 01-APR-19   31-DEC-12   100000     Approved

如果状态只有两个值,“Approved”和“Proposed”,则可以按状态排序并获取第一行。如果您有(或将来会有)更多的状态,并且您想定义优先级,请在“选择”中添加一列,其中包含一个“案例”,为每个状态分配相应的优先级。然后按此列排序并获取第一行……

您可以分别对每个员工使用条件排序,如下所示:

-- sample rows
with salaries (emp_id, name, salary, date_to, status) as (
    select 1001, 'Orange',  1400, date '4712-12-31', 'Rejected' from dual union all
    select 1001, 'Orange',  1200, date '4712-12-31', 'Approved' from dual union all
    select 1002, 'Red',     2500, date '4712-12-31', 'Approved' from dual union all
    select 1003, 'Blue',    2700, date '4712-12-31', 'Proposed' from dual union all
    select 1004, 'Green',   2200, date '2012-07-31', 'Approved' from dual union all
    select 1005, 'White',   1200, date '4712-12-31', 'Approved' from dual union all
    select 1005, 'White',   1300, date '4712-12-31', 'Rejected' from dual )
-- end of sample data

select emp_id, name, salary, date_to, status
  from (
    select s.*, 
           row_number() over (partition by emp_id 
                              order by case status when 'Approved' then 1 end) rn
      from salaries s
      where date_to = date '4712-12-31')
  where rn = 1
结果:

    EMP_ID NAME       SALARY DATE_TO     STATUS
---------- ------ ---------- ----------- --------
      1001 Orange       1200 4712-12-31  Approved
      1002 Red          2500 4712-12-31  Approved
      1003 Blue         2700 4712-12-31  Proposed
      1005 White        1200 4712-12-31  Approved

其中ROWNUM提示:
JOIN
打开
。ROWNUM将无法解决此问题。我想要的条件是,薪资状态仅在有两行的情况下为“已批准”:否则,我希望查询作为isHint获取:where子句中的函数调用(例如,
HR\u GENERAL.END\u OF\u TIME
)是性能杀手。此外,每次调用NVL时,它都会计算这两个分支。使用
COALESCE
而不是
NVL
。是否仍将过时的和用于外部联接?是时候使用左/外关键字更改并切换到显式联接了。按案例排序状态当“已批准”时,则1端不起作用。。。rn为1,2,不管。。。并且日期可以是任何日期,如果仅重新记录单行,但如果检索了两行,则只有带“approved”的行被拾取