SQL 查询完全扫描两次时出现问题



表 A

ID    EmpNo   Grade
--------------------    
1      100    HIGH
2      105    LOW
3      100    MEDIUM
4      100    LOW
5      105    LOW

查询:

select * 
from A 
where EMPNO = 100 
  and rownum <= 2 
order by ID desc 

我尝试此查询来检索最大值和最大值 1;我需要比较 max 和 max-1 的等级,如果相等,我需要在不使用光标的情况下将标志设置为"Y"或"N"。我也不想扫描整个记录两次。

请帮助我。

ROWNUM 在 ORDER BY 之前应用,因此您需要像这样嵌套查询:

select * from
(select * from A where EMPNO =100 order by ID desc)
where rownum<=2

它只执行一个表扫描(或者它可能使用 EMPNO 上的索引)。

select *
from (
select id, emp_no, grade
       , case 
          when lag(grade) over (order by emp_no desc) = grade 
          then 'Y' 
          else 'N'     
          end
          as flag
      , dense_rank() over( order by emp_no desc)  as rank
from t
)
where rank <=2
;

最新更新