Как написать следующий фрагмент SQL для SQL Server 2000 - PullRequest
0 голосов
/ 24 октября 2011

Может ли кто-нибудь помочь, как написать приведенный ниже код в SQL Server2000?Спасибо

 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 ]

2 голосов
/ 24 октября 2011

В 2000 году нет функции OVER (), поэтому вам нужно будет переадресовать / переместить начальный выбор cte. У вас уже есть переменная таблицы @table, поэтому я бы изменил ее, добавив в нее столбцы идентификаторов.

Затем вы можете использовать подзапрос, чтобы извлечь то, что вам нужно из cte2.

2 голосов
/ 24 октября 2011

В ответе DigbySwift упоминается, что существует проблема с ROW_NUMBER, и вам необходимо сначала ее решить.Вы можете использовать идею в его ответе, а также посмотреть ответы на похожие вопросы:

Однако есть и другая проблема: SQL Server 2000 не поддерживает CTE (WITH ... AS ...).

Чтобы решить эту проблемуиспользуйте подвыборы вместо CTE, удалив предложение WITH и переместив определение CTE в те места, где он используется.

Например, этот запрос с использованием CTE:

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

Становится:

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

Надеюсь, этого достаточно, чтобы вы начали.

...