2015-07-28 4 views
3

Я запускаю этот запрос для SQL Server 2008+, но он не работает на SQL Server 2000. , и мне нужно это выполнить.Как преобразовать этот запрос в синтаксис SQL Server 2000

WITH CTE AS ( 
    SELECT 
     custnum, 
     custname, 
     RN = ROW_NUMBER() OVER(PARTITION BY custnum, custname ORDER BY custnum) 
    FROM 
     cust 
) 
SELECT 
    * 
FROM 
    CTE 
WHERE RN > 1 

Большое вам спасибо за помощь!

+0

Что означает 'но это не работает'? Вы получаете сообщение об ошибке? – Jens

+2

Из любопытства, почему вы используете SQL Server 2000? Это ужасно устаревшее, неподдерживаемое и очень небезопасное программное обеспечение. – Dai

+0

@Jens OP опубликовал CTE (Common Table Expression) с инструкцией PARTITION, это последние дополнения к T-SQL и потребует радикальной перезаписи (возможно, с использованием CURSOR) для работы в более старых версиях SQL Server. – Dai

ответ

0

До SQL Server 2005, эта область проблемы была решена с упорядоченными вставками в #temp таблицу с IDENTITY колонкой, чтобы генерировать порядковый номер. Это позволит решить RANK() и ROW_NUMBER() требований.

т.д .:

-- Create empty temp table 
    SELECT custnum, custname, IDENTITY(INT, 1, 1) as RN 
    INTO #cust 
    FROM cust 
    WHERE 0 = 1 

    -- Populate with ORDER BY, to generate ascending RN 
    INSERT INTO #cust 
     (custnum, custname) 
    SELECT 
     custnum, custname 
    FROM 
     cust 
    ORDER BY 
     custnum, custname 

В этот момент, вы можете запросить MIN() для каждого custnum/custname группировки и использовать это, как вы будете использовать КТР.

Однако ... ROW_NUMBER() действительно то, что вы хотите здесь? Похоже, вы бы хотели RANK(), а не ROW_NUMBER().

0

Смотрите, если это работает

select custnum,custname from 
(
select (select count(*) from cust as t1 where t1.custnum<=t2.custnum) as sno, 
custnum,custname from cust as t2 
) as t 
where sno>1