您的位置:首页 > 其它

行号是按指定的逻辑顺序为查询结果集中的行分配的连续整数

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: