我必須遷移SQL才能在Microsoft SQL Server 2000上工作。不幸的是,當前的SQL使用的功能ROW_NUMBER()在此版本中尚不受支持。所以我必須找到類似的東西。消除SQL 2000的ROW_NUMBER()
我下面的SQL(我用*,而不是列出所有列)
SELECT [Id], ROW_NUMBER() OVER (ORDER BY InstallmentNumber, ID ASC) AS ROWID
FROM [ARAS].[ARAS].[Movement]
我必須遷移SQL才能在Microsoft SQL Server 2000上工作。不幸的是,當前的SQL使用的功能ROW_NUMBER()在此版本中尚不受支持。所以我必須找到類似的東西。消除SQL 2000的ROW_NUMBER()
我下面的SQL(我用*,而不是列出所有列)
SELECT [Id], ROW_NUMBER() OVER (ORDER BY InstallmentNumber, ID ASC) AS ROWID
FROM [ARAS].[ARAS].[Movement]
使用臨時表與標識列以模擬ROW_NUMBER可能是您最好的選擇明智表現:
CREATE TABLE #tmpRowNum (
ROWID INT IDENTITY(1,1),
ID INT
)
INSERT INTO #tmpRowNum
(ID)
SELECT ID
FROM [ARAS].[ARAS].[Movement]
ORDER BY InstallmentNumber, ID
不太清楚,但這裏有一個出發點:
SELECT [Id],
(SELECT SUM(1)
FROM [ARAS].[ARAS].[Movement]
WHERE InstallmentNumber <= OuterMovement.InstallmentNumber
AND ID <= OuterMovement.ID
) AS ‘Row Number’
FROM [ARAS].[ARAS].[Movement] AS OuterMovement
您可以創建一個變量表「ROWID」是一個INT標識值並將值插入該值。
您還可以使用ROWID進行操作。雖然性能不會太好...
DECLARE @id INT, @SUM INT
SELECT @id = MIN([Id]) FROM [ARAS].[ARAS].[Movement]
WHILE EXISTS (SELECT [Id] FROM [ARAS].[ARAS].[Movement] WHERE [Id] >= @id)
BEGIN
... do something with the ID ..
SELECT @SUM = SUM(...) FROM [ARAS].[ARAS].[Movement] WHERE [Id] > @id
SELECT @id = MIN([Id]) FROM [ARAS].[ARAS].[Movement] WHERE [Id] > @id
END
查詢的其餘部分在做什麼?它是否使用ROWID進行迭代?如果是這樣,可以有其他方法來處理這個問題。 – SQLMason 2011-04-18 16:27:19
是的。基本上它使用RowId來過濾數據。這個想法是總結所有以前的總價值。 選擇選擇與以下列'(SELECT SUM(總)WHERE RowId <= currentRowId)AS平衡' – Towa 2011-04-18 17:28:30
請參閱我編輯的答覆。 – SQLMason 2011-04-18 18:16:52