Sql 从查询中检索单行
我正在创建一个查询,以查找日期为'31-dec-4712'(最新)的员工的薪资详细信息。 但是,如果一名员工的两行日期为4712年12月31日,则在其他情况下,仅当 然后会出现应按原样返回的单行 我已经创建了以下薪资详细信息查询。需要以上场景的帮助吗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 ,
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”的行被拾取