2008年8月25日 星期一

Oracle 學習(5) rownum 的技巧

Oracle 的 rownum 是一個 pseudocolumn,意思是不存在的 column,是經由計算得來的.

先建立範例資料 .

create table emp(id int, sid char(10) not null, name char(10) not null);

insert into emp(id, sid, name) values (1, 'Charles', 'F111222333');
insert into emp(id, sid, name) values (2, 'Jerry', 'A121121121');
insert into emp(id, sid, name) values (3, 'Abel', 'H114567898');
執行下面的語法,可得到所有資料,且得到 rownum 代表的「列號」
select id, sid, name, rownum from emp;
結果如下,很正常。
image
但如果需要依 name 來排序,答案就怪怪的。
select id, sid, name, rownum from emp order by name;

結果如下,RowNum 是先經過編號後,才再 order by name 的。 
image

所以,如果要先 order by name 才編號,就必須下這樣的sql script

select t.*, rownum from (
	select id, sid, name from emp order by name ) t

結果如下

image 
相同的問題,如果在 SQL Server 2005 上,就設計地好多了,因為語法上很清楚地說明了「編號是針對order by name」來編號。

select *, ROW_NUMBER() over (order by name) from emp;
結果如下圖。看來 sql server 的設計是較貼近 developer 的.
image

沒有留言:

Share with Facebook