sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor ingen vinduesfunktioner i where-klausuler?

hvorfor kan jeg ikke bruge en vinduesfunktion i en where-klausul i SQL Server?

Et svar, selvom det ikke er særlig informativt, er fordi specifikationerne siger, at du ikke kan.

Se artiklen af ​​Itzik Ben Gan - Logical Query Processing:What It Is And What It Means to You og især billedet her. Vinduesfunktioner evalueres på tidspunktet for SELECT på resultatsættet, der er tilbage efter alle WHERE /JOIN /GROUP BY /HAVING klausuler er blevet behandlet (trin 5.1).

Jeg leder virkelig efter begrundelsen for ikke at kunne bruge vinduesfunktioner i where-klausuler.

Årsagen til, at de ikke er tilladt i WHERE klausulen er, at det ville skabe uklarhed. Stjæler Itzik Ben Gans eksempel fra højtydende T-SQL ved hjælp af vinduesfunktioner (s.25)

Antag, at dit bord var

CREATE TABLE T1
(
col1 CHAR(1) PRIMARY KEY
)

INSERT INTO T1 VALUES('A'),('B'),('C'),('D'),('E'),('F')

Og din forespørgsel

SELECT col1
FROM T1
WHERE ROW_NUMBER() OVER (ORDER BY col1) <= 3
AND col1 > 'B'

Hvad ville være det rigtige resultat? Ville du forvente, at col1 > 'B' prædikat kørte før eller efter rækkenummereringen?



  1. Postgresql:Scripting af psql-udførelse med adgangskode

  2. MySQL-forespørgselsstreng indeholder

  3. Manglende artefakt com.microsoft.sqlserver:sqljdbc4:jar:4.0

  4. Hurtig måde at opdage rækkeantallet af en tabel i PostgreSQL