mssql Row_Number() 分页 DISTINCT 问题

转载原文地址http://www.cnblogs.com/pumaboyd/archive/2008/04/20/1162376.html

这周碰到了很多奇怪的问题,有些是莫名的低级错误,有些这是一直以来未发现的错误。其中这个RowNumber()这个问题就是这样。

敬德兄写的底层负责自动生成T-SQL。当我需求对数据DISTINCT的时候就发现RowNuber() 和DISTINCT是有冲突的。

WITH ListOrder AS
(SELECT DISTINCT A.*,ROW_NUMBER() AS RowNumber FROM MyList A INNER JOIN MyListShop B ON A.ListID =B.ListID)
SELECT TOP 20 *  FROM ListOrder WHERE RowNumber > 80

这个效果是明显不能排除DISTINCT的,因为 RowNumber这一列已经永远不会相同了。

这样就面临两个问题,第一我改变T-SQL,第二或者敬德更改通用的底层。

两种我们想过的实现方法我都记录一下:

T-SQL改进(不一定适合所有的业务):

EXISITS(SELECT * FROM MyListShop WHERE ShopID= @ShopID)

(PS:敬德认为我原来的JOIN方式不合理,改用上面的EXISITS方式,更合理,我保留意见。但就目前的底层结构,如果要DISTINCT也只能EXISISTS方式)

通用底层改进(指定具体的DISTINCT列就可以了):

WITH ListOrder AS
(SELECT A.*,ROW_NUMBER() OVER (ORDER BY A.ListID) AS RowNumber FROM MyList A INNER JOIN MyListShop B ON A.ListID =B.ListID)
SELECT DISTINCT TOP 10 ListID,Title FROM ListOrder WHERE RowNumber > 20

看下来你可能会觉得不清楚,这是因为我省略了很多关于我们底层的实现。这里主要为了说明一个问题,就是在使用Row_Number()写通用分页方法时,应该考虑DISTINCT的问题。因为我发现网上很多写Row_Number分页的情况都没考虑这点,难道大家就都没碰到这个问题,还是大家都没有去实践。

mssql Row_Number() 分页 DISTINCT 问题

时间: 2024-10-13 22:27:43

mssql Row_Number() 分页 DISTINCT 问题的相关文章

mssql数据库分页查询效率的一次体会

这几天在一个项目,合同管理系统(是对老系统的升级和改造,老系统是VS2008做的),由于数据库的表是项目组根据老系统的数据库建的,所以在查询的适合我就需要自己创建视图来完成多表的查询,起初我是读取项目组成员建好的视图,里面有7张表,其中还包含视图,由于视图中join视图是不支持索引的,所以在查询第一页的时候(每一页20条数据,总共数据量是10W条左右),耗时800毫秒,但是 当row_number达到上千的时候,基本查询要6秒以上,每点击下一页,耗时会增加十几毫秒,到40000条也就是中间的时候

SQL Server的分页优化及Row_Number()分页存在的问题

[导读] 最近有项目反应,在服务器CPU使用较高的时候,我们的事件查询页面非常的慢,查询几条记录竟然要4分钟甚至更长,而且在翻第二页的时候也是要这么多的时间,这肯定是不能接受的,也是让现场用SQLServerProfiler把语 最近有项目反应,在服务器CPU使用较高的时候,我们的事件查询页面非常的慢,查询几条记录竟然要4分钟甚至更长,而且在翻第二页的时候也是要这么多的时间,这肯定是不能接受的,也是让现场用SQLServerProfiler把语句抓取了上来. 用ROW_NUMBER()进行分页

记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题

最近有项目反应,在服务器CPU使用较高的时候,我们的事件查询页面非常的慢,查询几条记录竟然要4分钟甚至更长,而且在翻第二页的时候也是要这么多的时间,这肯定是不能接受的,也是让现场用SQLServerProfiler把语句抓取了上来. 用ROW_NUMBER()进行分页 我们看看现场抓上来的分页语句: select top 20 a.*,ag.Name as AgentServerName,,d.Name as MgrObjTypeName,l.UserName as userName from

sqlserver里面的row_number分页问题

使用row_number分页的时候,可能需要一些条件,比如显示某个id下面的信息来分页等等,这些都需要加条件来判断. select * from (select row_number() over(order by id) as num, * from [sjk] where id=xxx) as t where t.num>=0 and t.num<=20 在这个里面明显要查找某个id的信息.但是这个where条件不能放在外面,放在外面一层会查不到数据.

MSSQL row_number简单使用语法

MSSQL row_number简单使用语法 select * from ( select row_number() over(partition by threadid order by date desc) r,threadid,username from blogs ) tppp where tppp.r=1 tppp.r=1可以找出排重后按排序规则排名第一的数据.

ROW_NUMBER分页的错误使用

之前在使用ROW_NUMBER分页获取数据的时候,直接用ROW_NUMBER里的SELECT语句查出了所有的数据. like this: select * from ( select row_number() over(order by LogID desc) as rnum,* from B_ShortProtectLog where addtime>='2014-9-1' and addtime<'2014-10-1' ) as tLog where rnum between 1 and

SqlServer 使用 row_number分页

select * from (select row_number()over(order by Server_no desc) as rownum,Server_no,Game_Name,Server_name from T_GameServer_List where IS_DELETE = 'N' and Game_name like '%q%')as t where t.rownum > #{condtion.offestStart} and t.rownum <= #{condtion.

ASP.NET和MSSQL高性能分页

首先是存储过程,只取出我需要的那段数据,如果页数超过数据总数,自动返回最后一页的纪录: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Clear -- Description: 高性能分页 -- http://www.cnblogs.com/roucheng/ -- =================================

row_number()分页案例

select * from (select *,row_number() over (order by id) as new_id from dt_article where channel_id=2) as new_table where new_id between 11 and 20 说明:返回结果集分区内行的序列号,每个分区的第一行从  开始. 语法:ROW_NUMBER ()  (  order_by_clause ) . 备注:  子句可确定在特定分区中为行分配唯一 ROW_NUMB