SQL Serverのwhere句でウィンドウ関数を使用できないのはなぜですか?
1つの答えは、特に有益ではありませんが、仕様にはできないと書かれているためです。
Itzik Ben Ganによる記事-論理クエリ処理:それが何であり、それがあなたにとって何を意味するか、特にここの画像を参照してください。ウィンドウ関数は、SELECT
の時点で評価されます。 すべてのWHERE
の後に残っている結果セットについて / JOIN
/ GROUP BY
/ HAVING
条項が処理されました(ステップ5.1)。
本当に、where句でウィンドウ関数を使用できない理由を探しています。
WHERE
で許可されていない理由 条項は、あいまいさを生み出すということです。ウィンドウ関数を使用して高性能T-SQLからItzikBenGanの例を盗む(p.25)
テーブルが
だったとしましょうCREATE TABLE T1
(
col1 CHAR(1) PRIMARY KEY
)
INSERT INTO T1 VALUES('A'),('B'),('C'),('D'),('E'),('F')
そしてあなたの質問
SELECT col1
FROM T1
WHERE ROW_NUMBER() OVER (ORDER BY col1) <= 3
AND col1 > 'B'
正しい結果は何でしょうか? col1 > 'B'
を期待しますか 述語は行番号付けの前または後に実行されましたか?