Nic*_*eys 8 sql sql-server sql-server-2008
希望这对于SQL-Ninja来说是微不足道的......试图让以下查询工作:
这适用于SQL Server 2008
SELECT
ROW_NUMBER() OVER (ORDER BY Date_Time DESC) AS RowNumber, *
FROM
(SELECT
T.A_ID, T.User_Name, T.Date_Time, T.Value,
U.ID, U.Name, U.Field1, U.Field2,
COUNT(U.ID) OVER () AS TotalRows
FROM
TeeTable as T
INNER JOIN
YouTable AS U ON T.U_ID = U.ID
WHERE
T.Value BETWEEN 222 AND 225) Filtered
WHERE
RowNumber BETWEEN 1 AND 5
Run Code Online (Sandbox Code Playgroud)
这些值在某种程度上是为了给出一个具体的例子而设计的,但是查询的精神被完全保留了下来.我从这个陈述中得到的错误是:
列名称'RowNumber'无效.
如果我删除最后的WHERE子句(RowNumber BETWEEN ...),它返回一个预期的结果集(A_ID,User_Name,Date_Time等...),在所述结果中RowNumber为一列(具有敏感值).但我无法在WHERE子句中与它进行比较.我显然做了一些愚蠢的事情,但这达到了我的SQL限制!
我已经尝试将其重新安排为CTE,(WITH Filtered AS ...)但最终结果是一样的,看来这只是我已经在做的糖.
想法?如何过滤RowNumber派生列?
Rem*_*anu 17
您必须将WHERE运算符移动到创建RowNumber列的项目列表上方.使用派生表或CTE:
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (...) as RowNumber
FROM ...) As ...
WHERE RowNumber = ...
Run Code Online (Sandbox Code Playgroud)
等效的CTE是:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (...) as RowNumber
FROM ...)
SELECT * FROM cte
WHERE RowNumber = ...
Run Code Online (Sandbox Code Playgroud)
窗口函数(其中ROW_NUMBER是最熟悉的)在查询的最后阶段填充,远在WHERE子句之后.因此,您也必须将其嵌套,以便对其进行过滤:
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY Date_Time DESC) AS RowNumber, *
FROM
( SELECT T.A_ID, T.User_Name, T.Date_Time, T.Value,
U.ID, U.Name, U.Field1, U.Field2,
COUNT(U.ID) OVER () AS TotalRows
FROM
TeeTable as T INNER JOIN YouTable AS U
ON T.U_ID = U.ID
WHERE T.Value BETWEEN 222 AND 225
) Numbered
) Filtered
WHERE RowNumber BETWEEN 1 AND 5
Run Code Online (Sandbox Code Playgroud)
您也可以将它们放在CTE或视图中以获得相同的效果.