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