Проблема с полным сканированием SQL-запроса дважды?

#oracle

#Oracle

Вопрос:

Таблица 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 
  

Я попробовал этот запрос, чтобы получить значение max и max-1; Мне нужно сравнить оценку с max и max-1, если равно, мне нужно установить флаг как ‘Y’ или ‘N’ без использования курсора. Также я не хочу сканировать всю запись дважды.

Пожалуйста, помогите мне.

Ответ №1:

ROWNUM применяется перед ORDER BY, поэтому вам нужно вложить запрос следующим образом:

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

Это выполняет только одно сканирование таблицы (или может использовать индекс в EMPNO).

Комментарии:

1. как здесь расшифровать? мне нужно проверить оценку из rownum = 1 и rownum = 2, если равно, мне нужно ‘Y’ как o / p или ‘N’

Ответ №2:

 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
;