2009-02-15 7 views
0

Je commence à jouer avec ASP.NET MVC et je suis tombé sur la question de vouloir faire un peu de pagination de base. Donc je cette simple déclaration LINQ (en utilisant la base de données Northwind) pour obtenir 10 articles pour une page spécifique:Que fait exactement la clause "Over" dans T-Sql?

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

Il fonctionne bien, mais quand je débogués, j'étais curieux de ce que le SQL réel a été généré par LINQ à Sql. Ce fut la sortie:

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] 

Maintenant, je ne suis pas expert SQL du tout, ce qui est la raison pour laquelle je ne l'ai jamais vu la clause « OVER ». Je suis juste curieux d'un niveau élevé de savoir exactement ce qu'il fait et quand est-il utilisé?

Répondre

1

Il indique à la fonction ROW_NUMBER comment affecter un nombre à chaque ligne, en fonction de l'expression entre parenthèses. Cependant, les lignes ne sont pas triées en fonction de ce nombre dans la sous-requête. Voilà à quoi sert la sorte dans la requête externe.

+0

Merci! Fait beaucoup de sens. – BFree

3

ROW_NUMBER() OVER

renvoie le numéro séquentiel d'une rangée dans une partition d'un ensemble de résultats, à partir de 1 pour la première ligne de chaque partition.

Dans votre exemple, le ResultSet est commandés en descendant OrderDate puis la fonction ROW_NUMBER est appliquée. Comme le DOK l'a dit, la clause OVER n'est pas utilisée seule, mais en conjonction avec les fonctions de fenêtrage agrégées et de classement.

De MSDN -

Clause OVER (Transact-SQL)

Détermine la partition et commande de l'ensemble de lignes avant que la fonction de fenêtre associée est appliquée.

+0

+1 pour une excellente clarté - merci! – DCaugs

1

OVER n'est pas utilisé seul. Il est utilisé conjointement avec RANK, DENSE RANK, NTILE et ROW NUMBER. Dans ce cas, il est utilisé avec ROW_NUMBER pour récupérer uniquement les enregistrements nécessaires à l'affichage à ce moment, dans ce cas les 10 éléments de cette page.