Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在where子句中使用排序函数派生列(SQL Server 2008)_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

在where子句中使用排序函数派生列(SQL Server 2008)

在where子句中使用排序函数派生列(SQL Server 2008),sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,希望这对SQL忍者来说是微不足道的。。。正在尝试使以下查询正常工作: 这是针对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,

希望这对SQL忍者来说是微不足道的。。。正在尝试使以下查询正常工作:

这是针对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
这些值在某种程度上是为了给出一个特定的示例,但查询的精神完全保留了下来。我从该语句中得到的错误是:

列名“RowNumber”无效

如果我删除最后一个WHERE子句(RowNumber BETWEEN…),它将返回一个预期结果集(A_ID、用户名、日期、时间等),其中RowNumber作为所述结果中的一列(带敏感值)。然而,在WHERE子句中,我无法与之相比。我显然在做一些愚蠢的事情,但这已经达到了我的SQL极限

我也尝试过将其重新安排为CTE(过滤为…),但最终结果是一样的,看来这只是我已经在做的事情的一个糖分


想法?如何根据RowNumber派生列进行筛选?

必须将WHERE运算符移动到创建RowNumber列的项目列表上方。使用派生表或CTE:

SELECT * 
  FROM (
   SELECT *, ROW_NUMBER() OVER (...) as RowNumber
   FROM ...) As ...
 WHERE RowNumber = ...
等效CTE为:

WITH cte AS (
SELECT *, ROW_NUMBER() OVER (...) as RowNumber
       FROM ...)
SELECT * FROM cte 
WHERE RowNumber = ...   
窗口函数(最熟悉的是它的行号)在查询中很晚才填充,在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

您也可以将它们放在CTE或视图中,以获得相同的效果。

查询的问题是由于逻辑处理顺序中的错误造成的。这是MSDN dev网络中指定的逻辑处理顺序

SELECT语句的逻辑处理顺序 以下步骤显示SELECT语句的逻辑处理顺序或绑定顺序。此顺序确定在一个步骤中定义的对象何时可用于后续步骤中的子句。例如,如果查询处理器可以绑定(访问)FROM子句中定义的表或视图,则所有后续步骤都可以使用这些对象及其列。相反,由于SELECT子句是步骤8,因此前面的子句不能引用该子句中定义的任何列别名或派生列。但是,它们可以由后续的子句(如ORDER by子句)引用。请注意,语句的实际物理执行由查询处理器决定,并且顺序可能与此列表不同。 从…起 在…上 参加 哪里 分组 使用多维数据集还是使用汇总 有 挑选 不同的 订购人 顶

因此,在from部分的子查询中将ranking函数作为别名引入,然后您将能够在where部分的别名上设置条件


祝你好运

避免使用
mssql
标记,因为它很容易与
mysql