Что не так с этим запросом? Не удается заставить ROW_NUMBER () работать

SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY hrl.Frn) as Row,
        hrl.unq, hrl.LcnsId, hc.Business,hc.Name,hc.Phone,
        hrl.Frn,hrl.CallSign, hrl.gsamarkettypeid, 
        gmt.[Market Type Code] + ' - ' + gmt.gsamarkettype,
        hrl.gsalatitude,hrl.gsalongitude,
        rsc.RadioServiceCode + ' - ' + rsc.RadioService, 
                    GrantDt, ExpirationDt, EffectiveDt, 
        CancellationDt
        FROM dbo.sbi_f_HldrRgstrtnLcns hrl
        INNER JOIN dbo.sbi_f_HldrCntcts hc on 
                    hc.CallSign = hrl.CallSign
        INNER JOIN dbo.sbi_l_radioservicecodes rsc on 
                    rsc.radioservicecodeid = hrl.radioservicecodeid
        LEFT OUTER JOIN dbo.sbi_l_GSAMarketTypes gmt on 
                    gmt.GSAMarketTypeId = hrl.GSAMarketTypeId
        WHERE hc.Entity_Type = 'L'  AND hrl.LicenseStatusId IN (1)
        and Row >=1 and Row <= 20) -- The error occurs here,
                    -- it says incorrect syntax near )
10.12.2008 20:58:06
4 ОТВЕТА
РЕШЕНИЕ

Переместите критерии ряда во внешний выбор

SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY hrl.Frn) as Row,
     ...
               WHERE hc.Entity_Type = 'L'  AND hrl.LicenseStatusId IN (1)
              ) T
WHERE T.Row >=1 and T.Row <= 20)
6
10.12.2008 21:06:36

Вы не можете использовать псевдоним для столбца в предложении where, потому что предложение where обрабатывается перед предложением Select.

Отредактированный:

Вы также можете просто добавить подзапрос в предложении where

Where ((SELECT ROW_NUMBER() OVER (ORDER BY hrl.Frn)) < 20,

или вообще не используя Row_Number,

Where (Select Count(*) 
From dbo.sbi_f_HldrRgstrtnLcns 
Where Frn < hrl.Frn) < 20
0
5.07.2009 15:16:27
Нет, потому что теперь он ожидает ключевое слово OVER.
Xaisoft 10.12.2008 21:05:58
И ROW_NUMBER () не допускается в предложении where.
Shannon Severance 3.07.2009 16:25:04

Вы можете сделать это с помощью CTE:

WITH NumberedRows AS
(
    SELECT 
        ROW_NUMBER() OVER (ORDER BY hrn.Frl) AS RowNum,
        ...
    WHERE 
        hc.Entity_Type = 'L'
        AND hrl.LicenseStatusId IN (1)
)
SELECT
    *
FROM
    NumberedRows
WHERE
    RowNum <= 20
1
10.12.2008 21:11:01

проверьте, какую версию базы данных SQL Server вы используете. Row_number добавляется с sql server 2005 года. Он не будет поддерживать SQL Server 2000

0
29.12.2008 15:22:46