2011-10-24 54 views
0

有人可以幫助如何在SQL Server2000中編寫下面的代碼嗎?由於如何爲SQL Server 2000編寫下面的SQL片段

WITH cte 
    AS (SELECT *, 
       (Row_number() OVER(ORDER BY productid, transactionid, 
        statusdate 
        DESC) 
        )AS 
       rownum 
     FROM @table), 
    cte2 
    AS (SELECT cte.*, 
       (CASE 
        WHEN cte.status = Isnull((SELECT t.status 
               FROM cte t 
               WHERE t.rownum = (cte.rownum + 1 
                   )), 
             '') 
        THEN 1 
        ELSE 0 
        END)AS rownum2 
     FROM cte) 
SELECT cte2.productid, 
     cte2.transactionid, 
     cte2.details, 
     cte2.status, 
     cte2.statusdate, 
     cte2.requestdate 
FROM cte2 
WHERE rownum2 = 0 
+0

你試過了什麼?請嘗試一些內容,然後發佈給其他人進行編輯,投票等。 –

+0

對2005年的參考還有什麼意義?這個代碼是從哪裏來的?請花一些時間來解釋,並且您會得到更好的答案 –

+0

SQL Server 2005具有OVER()函數,該函數在2000年不可用。此SQL不會在SQL Server 2000中運行。 – Digbyswift

回答

2

DigbySwift's answer提到,有一個與ROW_NUMBER一個問題,你首先需要解決。您可以使用他的答案的想法,你也可以看看回答類似的問題,如這些:

但是這裏還有另外一個問題:SQL Server 2000點中沒有按不支持CTE(WITH ... AS ...)。

通過刪除WITH子句並將CTE的定義移動到使用它的位置來解決此用法子查詢而不是CTE。

例如這個查詢使用CTE:

WITH T1 AS (SELECT a,b,c FROM ...) 
SELECT * FROM T1 

變爲:

SELECT * 
FROM (
    SELECT a,b,c FROM ... 
) AS T1 

希望這是足以讓你開始。

+0

是的,子選擇解決了許多問題,人們張貼在SO :) –

+0

另外我覺得Row_Number()函數也沒有在2000年定義,這裏是我的完整查詢 –

+0

我已鏈接完整的查詢轉換..謝謝, –

2

2000年沒有OVER()函數,所以你需要重新編址/移動初始選擇。你已經有一個表變量@table,所以我會通過添加一個標識列來修改它以包含行號。

然後,您可以使用子查詢從cte2中提取您需要的內容。

+0

http:///stackoverflow.com/questions/7875247/convert-sql-server-2005-to-2000 –