Проблема в SQL-запросе полного сканирования дважды? - PullRequest
0 голосов
/ 17 мая 2011

Таблица 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' без использования курсора.Также я не хочу сканировать всю запись дважды.

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

Ответы [ 2 ]

1 голос
/ 17 мая 2011
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
;
1 голос
/ 17 мая 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...