четверг, 7 июня 2012 г.

MSSQL : Как использовать row_number() в фильтре where

Надеюсь меня не лишат моего маленького звания MSTS....


Сегодня пока решал проблему отправки сообщений, наткнулся на то что row_number() нельзя напрямую использовать в фильтре where.


Честно говоря, когда мною использовалась нумерация, она обычно лежала где-нибудь в подзапросах или CTE, а тут хотел все и сразу, на что MS SQL сказал "неа....".



Собственно если вы попытаетесь выполнить такой код:


  1. USE AdventureWorks
  2. GO
  3.  
  4. SELECT ROW_NUMBER() OVER (
  5.         ORDER BY addressline1
  6.         ) AS rowNum
  7.     ,addressline1
  8.     ,city
  9. FROM person.address
  10. WHERE rowNum > 3;
* This source code was highlighted with Source Code Highlighter.


То получите такую ошибку:


Server: Msg 207, Level 16, State 1, Line
6 Invalid column name 'rowNum'


А решать проблему будем по старинке.


Вариант первый (подзапрос):


  1. SELECT *
  2. FROM (
  3.     SELECT ROW_NUMBER() OVER (
  4.             ORDER BY addressline1
  5.             ) AS rowNum
  6.         ,addressline1
  7.         ,city
  8.     FROM person.address
  9.     ) AS x
  10. WHERE rowNum > 3;
* This source code was highlighted with Source Code Highlighter.

Вариант второй (CTE):


  1. WITH x (
  2.     rowNum
  3.     ,addressline1
  4.     ,city
  5.     )
  6. AS (
  7.     SELECT ROW_NUMBER() OVER (
  8.             ORDER BY addressline1
  9.             ) AS rowNum
  10.         ,addressline1
  11.         ,city
  12.     FROM person.address
  13.     )
  14. SELECT *
  15. FROM X
  16. WHERE rowNum > 3;
* This source code was highlighted with Source Code Highlighter.

Комментариев нет: