http://blog.163.com/ting_software/blog/static/11553690820135183434561/

在基于数据库的系统的开发过程中,有时需要让select返回的查询结果中存在一列实际的数据库表中并不存在的序号列,即在查询结果中额外增加自增的伪序号列。从网络上可以找到一些解决方案,但总结起来主要有三种:

1.使用数据库自带的序号函数实现
Oracle提供的ROWNUM,SQL Server 2005提供的RANK,ROW_NUMBER都可以比较简单地实现这种需求,不过这种方法对我并不适用,因为我用的是SQL SERVER 2000。
2.使用临时表实现
SQL的IDENTITY函数可以提供自增的序号,但只能用在带有INTO table子句的SELECT语句中,所以如果可以使用临时表的情况下可以使用这种实现方法。和第一种方法一样,这种实现方法对我也不适用,因为现在的项目规定不能使用临时表。
eg:
SELECT IDENTITY(INT,1,1) as seq,field1,field2,...,fieldn INTO tmpTableName FROM srcTableName;
SELECT * FROM tmpTableName;
DROP TABLE tmpTableName;
3.使用SQL标准语法实现
第三种思路是:将结果集中能确定一行数据唯一性的某列或多列组合成标识符,再把结果集中小于等于标识符的记录数合计成一列,从而满足需求。
eg:
SELECT (SELECT COUNT(id) FROM srcTableName AS tbl1 WHERE tbl1.id<=tbl2.id) as seq,field1,field2,...,fieldn
FROM srcTableName AS tbl2 ORDER BY 1 ;

061213.jpg
图表
1
如果数据表本身并不内含自动地增编号的字段时,
要怎么做才能够让
SELECT
查询结果如图表
1
所示,额外增加自动递增序号呢?我们提供下列五种方法供您参考:
USE
北风贸易
;
GO
/*
方法一
*/
SELECT
序号
=
(SELECTCOUNT(
客户编号
)
FROM
客户
AS LiMing
WHERE LiMing.
客户编号
<=
Chang.
客户编号
),
客户编号
,
公司名称
FROM
客户
AS Chang ORDER BY 1;
GO
/*
方法二
:
使用
SQL Server 2005
独有的
RANK() OVER ()
语法
*/
SELECT
RANK() OVER (ORDER BY
客户编号
DESC) AS
序号
,
客户编号
,
公司名称
FROM
客户
;
GO
/*
方法三
*/
SELECT
序号
=
COUNT(*), LiMing.
客户编号
,
LiMing.
公司名称
FROM
客户
AS LiMing,
客户
AS
Chang
WHERE LiMing.
客户编号
>=
Chang.
客户编号
GROUPBY LiMing.
客户编号
,
LiMing.
公司名称
ORDERBY
序号
;
GO
/*
方法四
建立一个「自动编号」的字段,然后将数据新增至一个区域性暂存数据表,
然后由该区域性暂存数据表中,将数据选取出来,最后删除该区域性暂存数据表
*/
SELECT
序号
= IDENTITY(INT,1,1)
,
管道
,
程序语言
,
讲师
,
资历
INTO
#LiMing
FROM
问券调查一
;
GO
SELECT
*FROM #LiMing;
GO
DROP
TABLE #LiMing;
GO
/*
方法五
使用
SQL Server 2005
独有的
ROW_NUMBER() OVER ()
语法
搭配
CTE
(一般数据表表达式,就是
WITH
那段语法)选取序号
2 ~ 4
的数据
*/
WITH
排序后的图书
AS
(SELECT ROW_NUMBER()OVER(ORDERBY
客户编号
DESC)AS
序号
,
客户编号
,
公司名称
FROM
客户
)
SELECT
*FROM
排序后的图书
WHERE
序号
BETWEEN 2 AND 4;
GO