защо не мога да използвам функция с прозорец в клауза where в SQL Server?
Един отговор, макар и не особено информативен, е, защото спецификацията казва, че не можете.
Вижте статията на Ицик Бен Ган – Обработка на логическа заявка:Какво представлява и какво означава за вас и по-специално изображението тук. Функциите на прозореца се оценяват в момента на SELECT
върху резултантния набор, оставащ след всички WHERE
/JOIN
/GROUP BY
/HAVING
клаузите са разгледани (стъпка 5.1).
наистина търся причината да не мога да използвам функциите за прозорци в клаузите where.
Причината, че не са разрешени в WHERE
клауза е, че ще създаде неяснота. Кражба на примера на Ицик Бен Ган от високопроизводителен T-SQL с помощта на прозоречни функции (стр.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'
предикат се изпълнява преди или след номерирането на редовете?