SQL WITH语句,where子句中的未知列

时间:2010-01-13 09:53:17

标签: sql sql-server sql-server-2005 tsql

我有以下查询引发以下错误

  

未知列'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

4 个答案:

答案 0 :(得分:5)

这是因为WHERE子句中无法识别别名。相反,请使用如下所示的完整查询:

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

答案 1 :(得分:3)

尝试打包查询以使名称在where子句中可用

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

答案 2 :(得分: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    

答案 3 :(得分:0)

怎么样:

选择前10名* 来自员工 按排名说顺序

或者,如果没有where rownum子句,它是否有效。 (为什么你的介意如此棘手?)。