SQLではorder by句を指定して検索結果をソートすることが出来ます。
また、検索結果に対してシーケンシャルな番号を振る
rownum という特別なフィールドがあります。
この二つを同時に使用すると、まず検索結果の各行に対してrownumがふられ、その次にorder byが実行されるため、rownumの順番が滅茶苦茶になってしまいます。
SELECT emp_id,rownum
FROM employee;
このSQLを実行すると結果は下図のようになります。
<<table1>>
order byした後にrownumを付加する
このSQLに対してorder byを指定すると、SQLは下記のようになります。
SELECT emp_id,rownum
FROM employee
order by emp_id;
このSQLを実行すると結果は下図のようにrownumが滅茶苦茶な順序になってしまいます。
<<table2>>
order byした後にrownumを付加する

コーディングをしていると、order byした後にrownumをふりたい場合があります。
こういった場合、
仮想表 というのを利用して対処します。
先ほどのtable2のようにorder byを指定したSQLを作成します。rownumはここでは外します。このSQL検索結果を仮想表としてFROM句に記述します。
そして、その仮想表に対してのフィールドとしてrownumをふります。
具体的にSQLは以下のようになります。
SELECT emp_id,rownum
FROM (select emp_id
from tztorsp
ORDER BY emp_id
);
from句の()で囲んだSQL文が仮想表になります。ここでまずorder byします。このorder byした仮想表に対してrownumをふっていることになると以下のように意図したとおりにSQL結果が得られます。
emp_id rownum
------ ------
1992003 1
2000001 2
1995311 3
1972003 4