2010-01-13 2 views
2

я ве получил следующий запрос, который бросает следующее сообщение об ошибкеSQL с утверждением, Unknown Колонка в котором положение

Unkown Колонка «RowNum»

WITH Employees AS 
(
SELECT 
    (keyTblSp.RANK * 3) AS [Rank], 
    sp.*, 
    addr.Street, 
    addr.PostOfficeBox, 
    addr.StreetNumber 
FROM Employee sp  
    INNER JOIN 
     FREETEXTTABLE(Employee, *, 'something', 1000) AS keyTblSp 
     ON sp.EmployeeId = keyTblSp.[KEY]  
    LEFT OUTER JOIN [Address] addr ON addr.EmployeeId = sp.EmployeeId 
UNION ALL 
SELECT 
    (keyTblAddr.RANK * 2) AS [Rank], 
    sp.*, 
    addr.Street, 
    addr.PostOfficeBox, 
    addr.StreetNumber 
FROM Employee sp  
    LEFT OUTER JOIN [Address] addr ON addr.EmployeeId = sp.EmployeeId 
    INNER JOIN 
     FREETEXTTABLE([Address], *, 'something', 1000) AS keyTblAddr 
     ON addr.AddressId = keyTblAddr.[KEY] 
) 

SELECT ROW_NUMBER() OVER (ORDER BY [Rank] DESC) AS RowNum, * 
FROM Employees 
WHERE RowNum BETWEEN (1 - 1) * 10 + 1 AND 1 * 10 
ORDER BY Rank DESC 

ответ

3

Попробуйте wrpping ваш запрос, чтобы получить имя годный к употреблению в ИНЕКЕ

SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY [Rank] DESC) AS RowNum , * FROM Employees) AS Results WHERE RowNum BETWEEN (1 - 1) * 10 + 1 AND 1 * 10 ORDER BY Rank

5

Это потому, что псевдонимы не являются признанных в статьях WHERE. Вместо этого используйте полный запрос, как это:

WHERE ROW_NUMBER() OVER (ORDER BY [Rank] DESC) BETWEEN (1 - 1) * 10 + 1 AND 1 * 10

+1

+1. Пятно на. Супер. – Guru

0

Как насчет:

выбрать 10 лучших * из сотрудников порядке ранга Desc

Кроме того, она работает без где ROWNUM пункт. (почему это так сложно?).

2

Ваш пункт WHERE не может ссылаться на функцию окна или агрегата, такую ​​как ROW_NUMBER(). Если вы хотите, чтобы отфильтровать результат ROW_NUMBER(), вы должны сделать это в пункте HAVING:

... 
SELECT ROW_NUMBER() OVER (ORDER BY [Rank] DESC) AS RowNum, * 
FROM Employees 
HAVING RowNum BETWEEN (1 - 1) * 10 + 1 AND 1 * 10  
ORDER BY Rank DESC  
Смежные вопросы