很多朋友都碰到這個問題,如果在查詢中產生一個行號。比如有如下表 tblA ID, CNAME, SCORE 1 A001 80 2 B002 71 3 C003 92 4 E004 80 5 D005 85 想按分數來得到名次,如何?? Access的SQL語句中沒有rownum之類的偽列函數。 不過除了採用程式來實現外,你還可以通過下面SQL查詢語句來實現一、按成績排序,並列者向下順延(如下沒有第三名,並列兩個第四)。 ID CNAME SCORE SNO 3 C003 92 1 5 D005 85 2 4 E004 80 4 1 A001 80 4 2 B002 71 5 select a.ID, a.CNAME, a.SCORE,count(*) as SNO from tblA a inner join tblA b on a.SCORE<=b.SCORE group by a.ID, a.CNAME, a.SCORE order by a.SCORE desc 二、按成績排序,並列者向上順延(如下沒有第四名,並列兩個第三)。 ID CNAME SCORE SNO 3 C003 92 1 5 D005 85 2 4 E004 80 3 1 A001 80 3 2 B002 71 5 select a.ID, a.CNAME, a.SCORE,count(b.ID)+1 as SNO from tblA a left join tblA b on a.SCORE<b.SCORE group by a.ID, a.CNAME, a.SCORE order by a.SCORE desc 三、按成績排序,並列者以學號大者在先。 ID CNAME SCORE SNO 3 C003 92 1 5 D005 85 2 4 E004 80 3 1 A001 80 4 2 B002 71 5 select a.ID, a.CNAME, a.SCORE,count(*) as SNO from tblA a inner join tblA b on (a.SCORE<b.SCORE or (a.SCORE=b.SCORE and a.ID<=b.ID)) group by a.ID, a.CNAME, a.SCORE order by 4 以上為標準SQL查詢語句。除此之外,在ACCESS環境中還可以用DCOUNT域函數來實現這個排序號。 用DCOUNT域函數來實現的優點是,這個查詢仍為可更新查詢。但僅在ACCESS環境中可用。如果你用ADO,DAO通過JET-SQL引擎則不可以了。比如你在ASP中。 一、 select id,CNAME,SCORE,DCOUNT('ID','tblA','SCORE>=' & SCORE) as SNO from tblA order by 4 二、 select id,CNAME,SCORE,DCOUNT('ID','tblA','SCORE>' & SCORE)+1 as SNO from tblA order by 4 三、 select id,CNAME,SCORE,DCOUNT('ID','tblA','SCORE>' & SCORE & ' OR (SCORE=' & SCORE & ' AND ID>=' & ID & ')' ) as SNO from tblA order by 4
|