Syntax of the checking rowid/rownum:
select rowud, rownum
from Table
select Col from(select Col
from Table
order by asc/desc)
where rownum Operator Condition;
--who takes the highest salary 1-5
select rownum, Subquery.*
from(
select emp_name, salary
from employee
order by salary desc) Subquery
where rownum <= 5;
기본적으로 부여된 rownum은 from/where절을 마치고 얻을 수 있다. 단, 순차적으로 처리할 수 있는 경우에만 같은 level의 where절을 사용할 수 있다.(ex. 몇 번의 rownum까지 표시하기 위해서) 따라서 순차적으로 접근하는 조건절을 사용하지 않는(쉽게 말해 6~10위를 구하라거나) 경우 Inline View로 한 번 더 감싸고, Main Query(Inline View의 바깥)에서 Alias로 접근하는 방식으로 취할 수 있다.
select * from (
select rownum RowNumAlias, Col1, Col1Alias, Col2 Col2Alias ...
from(
select Col1 Col2
from Table)
order by Col asc/desc)
where RowNumAlias between Num and Num
order by RowNumAlias asc/desc;
select *
from(
select rownum "RowNumAlias", SubQueryAlias.*
from(
select emp_name, salary
from employee
order by salary desc) SubQueryAlias
) SubqueryAlias
where RowNumAlias between 6 and 10;
위의 Top-N Analysis를 보충한 것. 상기했듯 1번부터 순차적으로 rownum에 접근하는 방식이 아닌 경우 하나의 Subquery만으로는 원하는 사잇값을 도출할 수 없다. (rownum은 from/where절을 마친 후에 생성되기 때문에 where절에서 조건문을 대입해봐야 rownum 생성 이전 시점이다.) 이러한 경우는 해당 코드를 한 번 더 Inline View로 감싸는 방법으로 개선할 수 있다. Inner-Inline View에서 모든 처리과정이 끝난 결과를 Outer-Inline View에서 받아 값을 도출하기 때문이다.
with InlineViewAlias
as (select Col ColAlias ...
from Table TableAlias)
select Col1, Col2, ColAlias
from InlineViewAlias
where ColAlias Condition/ComparisonOperators;
with emp_gender_Age
as
(select E.*,
trunc((sysdate-todate(decode(substr(emp_no, 8, 1)
, '1', 19, '2', 19, 20)
||substr(emp_no, 1, 6), 'yyyymmdd'))/365) Age
from employee E)
select emp_id, emp_name, Age
from emp_gender_Age
where Age between 30 and 49;
with InlineViewAlias as (Inline View)의 형식으로 Inline View Alias 재사용 또한 가능하다.