varför kan jag inte använda en fönsterfunktion i en where-klausul i SQL Server?
Ett svar, även om det inte är särskilt informativt, är att specen säger att du inte kan.
Se artikeln av Itzik Ben Gan - Logical Query Processing:What It Is And What It Means to You och i synnerhet bilden här. Fönsterfunktioner utvärderas vid tidpunkten för SELECT
på resultatuppsättningen som återstår efter alla WHERE
/JOIN
/GROUP BY
/HAVING
paragrafer har behandlats (steg 5.1).
egentligen letar jag efter resonemanget bakom att inte kunna använda fönsterfunktioner i where-satser.
Anledningen till att de inte är tillåtna i WHERE
klausul är att det skulle skapa oklarheter. Att stjäla Itzik Ben Gans exempel från högpresterande T-SQL med fönsterfunktioner (s.25)
Anta att ditt bord var
CREATE TABLE T1
(
col1 CHAR(1) PRIMARY KEY
)
INSERT INTO T1 VALUES('A'),('B'),('C'),('D'),('E'),('F')
Och din fråga
SELECT col1
FROM T1
WHERE ROW_NUMBER() OVER (ORDER BY col1) <= 3
AND col1 > 'B'
Vad skulle vara rätt resultat? Skulle du förvänta dig att col1 > 'B'
predikat körde före eller efter radnumreringen?