簡體   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