当前位置: 首页 > 面试题库 >

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

漆雕皓轩
2023-03-14
问题内容

希望这对于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,User_Name,Date_Time等…),其中将RowNumber作为列(包含有意义的值)显示在结果中。但是我无法在WHERE子句中与它进行比较。我显然在做一些愚蠢的事情,但这达到了我的SQL极限!

我也尝试过将其重新安排为CTE,(使用WITH Filtered AS …),但最终结果是相同的,看来这只是我已经在做的事情的一个糖。

有想法吗?如何过滤衍生自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 = ...


 类似资料:
  • 问题内容: 我知道在oracle / mysql / sqlserver语句中,您不能在子句中引用列别名,因为它是在之前执行的,但它在sqlite3中有效: 为什么在sqlite中这有可能? 问题答案: 使用启用了标志的sqlite3 : 从上面的指令堆栈可以看出,行的循环(第8-23行)针对表中的每一行对子句中的每个表达式重复执行and命令。 因此,要回答我自己的问题,sqlite引擎能够通过在

  • 问题内容: 我懂了 “无效的列名daysdiff”。 Maxlogtm是日期时间字段。是让我发疯的小东西。 问题答案: 通常,您不能在子句中引用字段别名。(将其视为包括别名在内的全部内容,在该子句之后应用。) 但是,如其他答案所述,您可以强制将SQL视为在子句之前进行处理。通常使用圆括号来强制操作的逻辑顺序,或者使用通用表表达式(CTE)来完成此操作: 括号/子选择: 或参阅亚当的CTE版本答案。

  • 问题内容: 我正在执行以下查询,并为所有列使用别名。我用命名了别名。因为这是必需的。现在,我想直接在where子句中引用别名,我的操作如下所示: 但是,当我执行此操作时,出现以下错误: 我知道SQL首先执行where子句,因此这就是错误的原因。但是我该如何解决呢?有什么建议吗? 问题答案: 您已经知道不能在子句中使用别名,但这仅适用于相同级别的SQL。您可以将查询包装在外部查询中: 唯一的选择是重

  • 问题内容: 我有这样的查询: 出现以下错误: 在MySql中,这是有效的,但显然在Postgresql中是无效的。据我所知,原因是查询部分的评估晚于该部分。是否有解决此问题的常用解决方法? 问题答案: 正如您所经历的那样,MySQL的支持是非标准的。正确的方法是重新打印SELECT子句中使用的相同表达式:

  • 问题内容: 我正在运行的查询如下,但是出现此错误: #1054-‘IN / ALL / ANY子查询’中的未知列’guaranteed_postcode’ 我的问题是:为什么我不能在同一数据库查询的where子句中使用伪列? 问题答案: 您只能在GROUP BY,ORDER BY或HAVING子句中使用列别名。 标准SQL不允许您在WHERE子句中引用列别名。之所以施加此限制,是因为执行WHERE

  • 问题内容: 我正在尝试搜索文本和备注的多列,以查找某些我不想看到的特定短语和黑名单短语。 假设下表 前任。我想找到所有提到(在任何领域中)“苹果”但黑名单中的“苹果酱”的故事。 如何在where子句中使用别名?我找不到有关此主题的任何文档: 1)这种方法可行吗? 2)替代方法是否意味着我将在每次行迭代中执行多个字符串连接? 问题答案: 我不能在where子句中使用别名。 这种方法可行吗? 当然,将