很多朋友都碰到这个问题,如果在查询中生成一个行号。比如有如下表 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