sql >> Databasteknik >  >> RDS >> Sqlserver

Varför inga fönsterfunktioner i where-satser?

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?



  1. Hur kan jag infoga kolumnkommentarer i PostgreSQL via Python?

  2. MySQL LOG10()-funktion – Returnera bas-10-logaritmen för ett värde

  3. Hur beställer man efter en SUM() i MySQL?

  4. PostgreSQL BESKRIV TABELL