如何为SQL Server 2000编写以下sql片段

时间:2011-10-24 11:29:03

标签: sql-server-2000

有人可以请教如何在SQL Server 2000中编写以下代码吗?感谢

 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 

2 个答案:

答案 0 :(得分:2)

DigbySwift's answer提到ROW_NUMBER存在问题,您需要先解决这个问题。你可以在他的答案中使用这个想法,你也可以看看类似问题的答案,如:

但是还有另一个问题:SQL Server 2000不支持CTE(WITH ... AS ...)。

要解决此问题,请通过删除WITH子句并将CTE的定义移动到使用CTE的位置来选择而不是CTE。

例如,使用CTE的此查询:

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

变为:

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

希望这足以让你开始。

答案 1 :(得分:2)

2000年没有OVER()函数,因此您需要重新寻址/移动初始cte选择。你已经有了一个表变量@table,所以我会通过添加一个标识列来修改它以包含行号。

然后,您可以使用子查询从cte2中提取所需内容。