行号是按指定的逻辑顺序为查询结果集中的行分配的连续整数
2014-09-22 17:03
295 查看
IF OBJECT_ID('TESTTBL') IS NOT NULL DROP TABLE TESTTBL;GOCREATE TABLE TESTTBL( empid VARCHAR(10) NOT NULL primary key, mgrid VARCHAR(10) NOT NULL, qty INT NOT NULL)INSERT INTO TESTTBL (empid,mgrid,qty) VALUES('A','Z',300),('B','X',100),('C','X',200),('D','Y',200),('E','Z',250),('F','Z',300),('G','X',100),('H','Z',150),('I','X',250),('J','Z',100),('K','Y',200)
1, row_number 函数SELECT empid,qty,ROW_NUMBER() OVER (ORDER BY qty) AS ROWNUM FROM TESTTBL ORDER BY qty empid qry rownumB 100 1G 100 2J 100 3H 150 4K 200 5C 200 6D 200 7E 250 8I 250 9F 300 10A 300 112, 基于游标的解决方案DECLARE @TestRN TABLE (empid VARCHAR(5), qty INT,
rn INT);DECLARE @empid AS VARCHAR(5), @qty as INT, @rn AS INT;--BEGIN TRAN DECLARE rncursor CURSOR FAST_FORWARD FOR SELECT empid, qty FROM TESTTBL ORDER BY qty, empid; OPEN rncursor; SET @rn=0; FETCH NEXT FROM rncursor INTO @empid, @qty; WHILE @@FETCH_STATUS=0
BEGIN SET @rn=@rn+1; INSERT INTO @TestRN (empid,qty,rn) VALUES (@empid,@qty,@rn) FETCH NEXT FROM rncursor INTO @empid, @qty; END CLOSE rncursor; DEALLOCATE rncusor; SELECT empid,qty,rn FROM @TestRN;--OMMIT TRAN3, 基于IDENTITY 的解决方案SELECT empid, qty, IDENTITY(INT,
1, 1) AS rnINTO @TestRN FROM TESTTBL ORDER BY qty, empid;SELECT * FROM @TestRN;DROP TABLE @TestRN;4, 按行号来实现简单分页DECLARE @pagesize as INT;DECLARE @pagenum as INT;SET @pagesize=3;SET @pagenum=3;WITH TEST AS( SELECT ROW_NUMBER() OVER (ORDER BY qty, empid) AS rownum,
empid, mgrid,qty FROM TESTTBL)SELECT rownum,empid, mgrid,qty FROM TESTWHERE rownum > @pagesize * (@pagenum-1)AND rownum ORDER BY rownum; Summary:在某种程度上,ROW_NUMBER 函数会比 游标、IDENTITY快很多,因为游标和IDENTITY会把结果保存到表中,以备后用,这两种方法会产生大量的I/O.
1, row_number 函数SELECT empid,qty,ROW_NUMBER() OVER (ORDER BY qty) AS ROWNUM FROM TESTTBL ORDER BY qty empid qry rownumB 100 1G 100 2J 100 3H 150 4K 200 5C 200 6D 200 7E 250 8I 250 9F 300 10A 300 112, 基于游标的解决方案DECLARE @TestRN TABLE (empid VARCHAR(5), qty INT,
rn INT);DECLARE @empid AS VARCHAR(5), @qty as INT, @rn AS INT;--BEGIN TRAN DECLARE rncursor CURSOR FAST_FORWARD FOR SELECT empid, qty FROM TESTTBL ORDER BY qty, empid; OPEN rncursor; SET @rn=0; FETCH NEXT FROM rncursor INTO @empid, @qty; WHILE @@FETCH_STATUS=0
BEGIN SET @rn=@rn+1; INSERT INTO @TestRN (empid,qty,rn) VALUES (@empid,@qty,@rn) FETCH NEXT FROM rncursor INTO @empid, @qty; END CLOSE rncursor; DEALLOCATE rncusor; SELECT empid,qty,rn FROM @TestRN;--OMMIT TRAN3, 基于IDENTITY 的解决方案SELECT empid, qty, IDENTITY(INT,
1, 1) AS rnINTO @TestRN FROM TESTTBL ORDER BY qty, empid;SELECT * FROM @TestRN;DROP TABLE @TestRN;4, 按行号来实现简单分页DECLARE @pagesize as INT;DECLARE @pagenum as INT;SET @pagesize=3;SET @pagenum=3;WITH TEST AS( SELECT ROW_NUMBER() OVER (ORDER BY qty, empid) AS rownum,
empid, mgrid,qty FROM TESTTBL)SELECT rownum,empid, mgrid,qty FROM TESTWHERE rownum > @pagesize * (@pagenum-1)AND rownum ORDER BY rownum; Summary:在某种程度上,ROW_NUMBER 函数会比 游标、IDENTITY快很多,因为游标和IDENTITY会把结果保存到表中,以备后用,这两种方法会产生大量的I/O.
相关文章推荐
- MySql 查询结果按照指定的顺序
- MySql查询结果按照指定顺序排序
- 在MySQL查询结果集中得到记录行号
- MySQL中在查询结果集中得到记录行号的方法
- 如何在MySQL查询结果集中得到记录行号
- 对聚集表查询的时候,未显式指定排序列的时候,默认查询结果的顺序一定是按照聚集索引顺序排序的吗
- MySQL中在查询结果集中得到记录行号的方法
- MySql查询结果按照指定顺序排序
- 如何在MySQL查询结果集中得到记录行号
- MySql查询结果按照指定顺序排序
- MySQL查询结果集中得到记录行号的实现
- MySQL中在查询结果集中得到记录行号的方法
- MySQL中在查询结果集中得到记录行号的方法
- mysql查询结果按指定顺序排序
- mysql 在查询语句返回的列中包含一列表示该条记录在整个结果集中的行号
- 如何在MySQL查询结果集中得到记录行号
- select union 查询出来的结果,如何按指定顺序输出
- MySql查询结果按照指定顺序排序
- 从sql查询结果集中查询
- SQL逻辑查询处理顺序,你知道吗?