Что именно делает предложение «Over» в T-Sql? - PullRequest
0 голосов
/ 16 февраля 2009

Я начинаю связываться с ASP.NET MVC и натолкнулся на вопрос о желании сделать базовый пейджинг. Поэтому я использовал этот простой оператор Linq (используя базу данных Northwind), чтобы получить 10 элементов для конкретной страницы:

var q = (from p in db.Orders
                     orderby p.OrderDate descending
                     select p).Skip(currentPage * pageAmount).Take(pageAmount);

Это работает хорошо, но когда я отлаживал, мне было любопытно, какой реальный SQL был сгенерирован Linq для Sql. Это был вывод:

SELECT [t1].[OrderID], [t1].[CustomerID], [t1].[EmployeeID], [t1].[OrderDate], [t1].[RequiredDate], [t1].[ShippedDate], [t1].[ShipVia], [t1].[Freight], [t1].[ShipName], [t1].[ShipAddress], [t1].[ShipCity], [t1].[ShipRegion], [t1].[ShipPostalCode], [t1].[ShipCountry]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[OrderDate] DESC) AS [ROW_NUMBER], [t0].[OrderID], [t0].[CustomerID], [t0].[EmployeeID], [t0].[OrderDate], [t0].[RequiredDate], [t0].[ShippedDate], [t0].[ShipVia], [t0].[Freight], [t0].[ShipName], [t0].[ShipAddress], [t0].[ShipCity], [t0].[ShipRegion], [t0].[ShipPostalCode], [t0].[ShipCountry]
    FROM [dbo].[Orders] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]

Теперь я вообще не эксперт по SQL, поэтому никогда не видел предложение "OVER". Мне просто интересно с высокого уровня, что именно он делает и когда он используется?

Ответы [ 3 ]

3 голосов
/ 16 февраля 2009

ROW_NUMBER() OVER

возвращает порядковый номер строки в разделе набора результатов, начиная с 1 для первого ряда в каждый раздел.

В вашем примере результирующий набор упорядочен по убыванию OrderDate, а затем к нему применяется функция ROW_NUMBER. Возвращенный набор результатов будет только там, где ROW_NUMBER is BETWEEN (@p0 + 1) and (@p0 + @p1)

Как сказал DOK, предложение OVER используется не само по себе, а в сочетании с функциями окна агрегирования и ранжирования.

С MSDN -

Предложение OVER (Transact-SQL)

Определяет разбиение и упорядочение набора строк перед применяется связанная оконная функция.

1 голос
/ 16 февраля 2009

OVER не используется в одиночку. Он используется вместе с RANK, DENSE RANK, NTILE и NOWBER NOWBER. В этом случае он используется с ROW_NUMBER для получения только тех записей, которые необходимы для отображения в данный момент, в данном случае это 10 элементов для этой страницы.

1 голос
/ 16 февраля 2009

Указывает функции ROW_NUMBER, как назначать номер каждой строке на основе выражения в скобках. Однако строки в действительности не сортируются в соответствии с этим числом в подзапросе. Вот для чего предназначен внешний запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...