Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Защо няма прозоречни функции в клаузите where?

защо не мога да използвам функция с прозорец в клауза 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' предикат се изпълнява преди или след номерирането на редовете?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Проверете типа на параметъра на функцията на дял в SQL Server (T-SQL)

  2. Възможно ли е да се изпълни текстов файл от SQL заявка?

  3. Как да изберете дата без час в SQL

  4. Създаване на Trigger за регистриране на SQL тази засегната таблица?

  5. Как да използвам псевдоним в клаузата where?