0

私は 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 to 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」句を見たことがありません。私は高レベルからそれが正確に何をし、いつ使用されるのか興味がありますか?

4

3 に答える 3

3

ROW_NUMBER() OVER

各パーティションの最初の行の 1 から始まる、結果セットのパーティション内の行の連続番号を返します。

あなたの例では、結果セットは降順で並べられてOrderDateおり、ROW_NUMBER関数がそれに適用されます。返される結果セットは、ROW_NUMBER is BETWEEN (@p0 + 1) and (@p0 + @p1)

DOK が言ったように、OVER句はそれ自体では使用されませんが、集計およびランキング ウィンドウ関数と組み合わせて使用​​されます。

MSDNから-

OVER 句 (Transact-SQL)

関連するウィンドウ関数が適用される前に、行セットの分割と順序付けを決定します。

于 2009-02-15T23:02:55.280 に答える
1

ROW_NUMBER括弧内の式に基づいて、各行に数値を割り当てる方法を関数に指示します。ただし、サブクエリ内でこの番号に従って行が実際にソートされるわけではありません。それが、外側のクエリの並べ替えの目的です。

于 2009-02-15T23:01:01.820 に答える
1

OVER は単独では使用されません。これは、RANK、DENSE RANK、NTILE、および ROW NUMBER と組み合わせて使用​​されます。この場合、ROW_NUMBER と一緒に使用して、その時点で表示に必要なレコード (この場合はこのページの 10 項目) のみを取得しています。

于 2009-02-15T23:03:01.833 に答える