了解 WHERE 子句中窗口函数的局限性
SQL Server 禁止在 WHERE 子句中使用窗口函数。此限制源于查询处理的基本顺序和结果解释中的潜在歧义。
SQL 标准规定窗口函数在 WHERE、JOIN、GROUP BY 和 HAVING 子句处理后运行。 因此,将它们包含在 WHERE 子句中在逻辑上是不可能的。
核心问题是不同的谓词评估顺序所产生的不确定性。 考虑这样一种场景:您想要选择列值超过特定阈值的行,但仅限于窗口函数定义的子集内(例如,前 N 行)。 结果完全取决于过滤条件是在窗口函数计算之前还是之后应用。
例如:
<code class="language-sql">SELECT col1 FROM T1 WHERE ROW_NUMBER() OVER (ORDER BY col1) > 3 AND col1 > 'B'</code>
结果会根据评估顺序而有所不同。 为了防止这种歧义并保证一致、可预测的查询结果,SQL Server 禁止在 WHERE 子句中使用窗口函数。 这可确保可靠的查询处理并避免意外结果。
以上是为什么不能在 SQL WHERE 子句中使用窗口函数?的详细内容。更多信息请关注PHP中文网其他相关文章!