繁体   English   中英

SQL Server 2000上的SQL Server ROW_NUMBER()?

[英]SQL Server ROW_NUMBER() on SQL Server 2000?

我有一个查询,允许我通过给它一个最小和最大限制从数据库表中获取记录。

它是这样的:

  SELECT T1.CDUSUARIO, T1.DSALIAS, T1.DSNOMBRE_EMPRESA, T1.DSCARGO, T1.DSDIRECCION_CORREO, T1.CDUSUARIO_ADMINISTRADOR, T1.FEMODIFICACION 
    FROM (SELECT *, 
               ROW_NUMBER() OVER (ORDER BY CDUSUARIO) as row FROM TBL_USUARIOS ) as T1 
   WHERE row > @limiteInf 
     and row <= @limiteSup 
ORDER BY DSALIAS ASC;

现在,它在SQL Server 2005和SQL Server 2008上就像天堂一样,但是试图在SQL Server 2000数据库上运行它并说:

ROW_NUMBER它是一个未知的函数名称或类似的东西。

我能做什么??

  • 有一个COUNT(*)与自连接解决方案在这里 ,将扩展严重
  • 您可以加载带有IDENTITY列的临时表并回读但不保证可以正常工作(找不到文章,多年前曾在MS研讨会上讲过)

这两种解决方案都不支持PARTITION BY

我没有提到基于循环或基于CURSOR的解决方案可能更糟

编辑20011年5月20日

IDENTITY无法工作的示例演示:
插入的记录是否始终接收连续的标识值

我知道这个线程有点旧,但对于其他寻找相同解决方案的人来说,我认为知道这个问题有一个很好的解决方案会很有用。

请在此处查看原始链接

对于那些不想点击链接的人,我复制并粘贴了以下代码。 再次,归功于原始出版商

下面是SQL Server 2000的SQL,用于通过单个列选择最新版本的记录分组。

SELECT *
  FROM (
    SELECT *, (
      SELECT COUNT(*)
        FROM MyTable AS counter
      WHERE counter.PartitionByColumn = MyTable.PartitionByColumn
        AND  counter.OrderByColumn >= MyTable.OrderByColumn
      ) AS rowNumber
    FROM MyTable
  ) AS r1
  WHERE r1.rowNumber = 1

SQL Server 2005中的相同代码如下所示:

SELECT * FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY PartitionByColumn 
    ORDER BY OrderByColumn DESC) AS rowNumber FROM MyTable) AS rw1 
  WHERE rw1.rowNumber = 1

使用其他功能或升级数据库。 ROW_NUMBER在2000版本的数据库中不存在。 点。 你无能为力。

这是我解决问题的方法:

declare @i int
declare @t table (row int, stuff varchar(99))
insert into @t
select 0,stuff from mytable -- <= your query
set @i=0
update @t set row=@i, @i=@i+1
select * from @t

说明:

  1. 创建一个内存表
  2. 插入数据(您的查询),行号为0
  3. 使用int变量更新行号字段,该变量在下一条记录的相同更新中递增(实际上变量先递增然后更新,因此它将从1开始)
  4. “选择”内存表中的结果。

你可能会问,为什么我不在select语句中使用变量? 它会更简单,但只有在没有结果的情况下才允许。 可以在更新中执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM