了解 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中文網其他相關文章!