`
pumaboyd
  • 浏览: 248377 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SQL2005 Row_Number() 分页问题

    博客分类:
  • DBA
阅读更多

这周碰到了很多奇怪的问题,有些是莫名的低级错误,有些这是一直以来未发现的错误。其中这个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分页的情况都没考虑这点,难道大家就都没碰到这个问题,还是大家都没有去实践。

分享到:
评论

相关推荐

    SQL ROW_NUMBER()分页比较

    在 SQL Server 2005 中,使用 ROW_NUMBER() 函数可以实现分页功能,这种方法相比于 SQL Server 2000 中的分页方式效率要高出很多。但是,很多人在使用 ROW_NUMBER() 函数时,使用的方法并不正确。 在本文中,我们将...

    Row_number 分页存储过程

    在SQL Server 2005及以后的版本中,`Row_number()` 成为了实现数据分页的标准方法,因为它既简单又高效。 `Row_number()` 函数的基本语法如下: ```sql ROW_NUMBER() OVER (ORDER BY ordering_column) ``` 在这个...

    row_number.rar_SQL中row_number用法_number

    `ROW_NUMBER()`在数据处理、分页查询、数据排序以及解决复杂的数据分析问题时起到关键作用。以下是对`ROW_NUMBER()`函数的详细解析。 1. **基本语法** `ROW_NUMBER()`函数的基本语法如下: ```sql SELECT ROW_...

    分页存储过程,仅适用于Sql2005以上,使用 ROW_NUMBER()函数用于多表分页查询,可以分组查询

    SQL Server 2005 及其后续版本引入了 `ROW_NUMBER()` 函数,使得实现分页功能变得更加简单高效。本文将详细介绍一个基于 SQL Server 2005 的分页存储过程,该存储过程不仅支持多表分页查询,还能进行分组查询。 ###...

    ROW_NUMBER()函数

    ROW_NUMBER() 函数是 SQL Server 2005 中的新功能,它可以实现数据的分页功能,从而提高数据查询的效率。在本文中,我们将详细介绍 ROW_NUMBER() 函数的使用方法和优点,以及如何使用它来实现高效的数据分页。 ROW_...

    SQL2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较

    rank函数与rank函数类似,同样考虑到了...这些函数在数据分析、报表生成以及分页查询等方面都有广泛应用,理解并掌握它们可以帮助开发者更高效地处理SQL查询任务。在实际使用中,应根据具体需求选择合适的排名函数。

    ROW_NUMBER() OVER函数的基本用法

    1. 分页:可以使用 ROW_NUMBER() OVER 函数来实现数据库的分页功能。 2. 自动添加字段编号:可以使用 ROW_NUMBER() OVER 函数来自动添加字段编号。 3. 数据分析:可以使用 ROW_NUMBER() OVER 函数来对数据进行分析和...

    SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同

    在SQL Server 2005之前的版本中,一种常见的分页查询方法是结合`TOP`和子查询来实现。基本思路是首先获取当前页之前的所有ID,然后排除这些ID,从而得到当前页的数据。例如,如果每页显示10条记录,查询第5页,我们...

    oracle分析函数row_number() over()使用

    Oracle的分析函数`ROW_NUMBER() OVER()`是一种强大的工具,用于在查询结果集中为每一行分配一个唯一的序列号。这个函数通常用于数据分页、排名或者为特定条件的记录分配顺序。下面我们将详细讨论`ROW_NUMBER() OVER...

    sqlServer使用ROW_NUMBER时不排序的解决方法

    设置sqlServer使用ROW_NUMBER时不排序 –1.看到NHibernate是这样写的分页,感觉写起来比较容易理解(应该不会有效率问题吧?) –with只是定一个别名? [sql] with query as (select ROW_NUMBER() over(order by ...

    SQL Server 2005中ROW_NUMBER()函数在存储过程分页中的应用.pdf

    在SQL Server 2005中,`ROW_NUMBER()`函数是一个非常重要的窗口函数,它在数据处理和查询优化方面发挥着关键作用,特别是在实现存储过程中的分页功能时。本文将深入探讨`ROW_NUMBER()`函数的工作原理,以及如何在...

    sqlserver 通用存储过程分页代码(附使用ROW_NUMBER()和不使用ROW_NUMBER()两种情况性能分析)

    首先,ROW_NUMBER()函数在SQL Server中被广泛用于生成行号,常用于分页查询。它为每一行提供一个唯一的整数值,可以根据这个值进行排序和分页。以下是一个使用ROW_NUMBER()的分页存储过程示例: ```sql ALTER ...

    SQL Server使用row_number分页的实现方法

    主要为大家详细介绍了SQL Server使用row_number分页的实现方法,具有一定的参考价值,感兴趣的朋友可以参考一下

    SQL2005利用ROW_NUMBER() OVER实现分页功能

    在SQL Server 2005中,为了实现高效的数据分页功能,开发人员常常会使用窗口函数ROW_NUMBER()配合OVER子句。ROW_NUMBER()函数在SQL Server中扮演着为每行分配唯一序列号的角色,这对于分页查询尤其有用。本文将详细...

    Row_Number() Sql分页

    采用另外一种方式来进行分页。。RowNumber方式或许更快,方式更好点

    row_number

    ### row_number() 函数...综上所述,`row_number()` 函数在 SQL 中的应用非常广泛,不仅可以帮助我们快速解决数据排序问题,还能在更复杂的场景下发挥重要作用。掌握好这一函数的使用方法,对于提升 SQL 技能大有裨益。

    Mssql 增加排序列,分组排序与普通排序 ROW_NUMBER.docx

    综上所述,`ROW_NUMBER()` 在SQL Server中是一种强大的工具,可以用于实现复杂的数据排序和分页,同时结合联接操作和过滤条件,可以高效地处理和展示大量数据。在实际应用中,可以根据业务需求灵活调整 `PARTITION ...

    sqlserver2005使用row_number() over分页的实现方法

    在SQL Server 2005中,`ROW_NUMBER()` 是一个非常重要的窗口函数,它用于为查询结果集的每一行分配一个唯一的行号。这个功能对于实现高效、灵活的分页查询至关重要,尤其是在处理大数据量的表格时。下面将详细解释`...

    ROW_NUMBER SQL Server 2005的LIMIT功能实现(ROW_NUMBER()排序函数)

    ROW_NUMBER() 函数是 SQL Server 2005 引入的一个重要特性,它使得数据库开发者能够在不支持 LIMIT 关键字的 SQL Server 中实现类似 MySQL 的分页效果。该函数可以为结果集中的每一行分配一个唯一的整数,从而允许...

    各数据库分页语法支持

    SQL Server 提供了多种分页方式,包括使用 ROW_NUMBER() 函数和 TOP 关键字结合的方式。 1. **ROW_NUMBER() 函数分页**: ```sql SELECT * FROM ( SELECT sid, ROW_NUMBER() OVER (ORDER BY sid DESC) AS ...

Global site tag (gtag.js) - Google Analytics