在SQL Server中如何将ROW_Number()与子查询列一起使用?

use*_*867 4 sql-server

这是我的查询:

DECLARE @StartRow INT
DECLARE @PageSize INT
SET @StartRow = 1
SET @PageSize = 5

SELECT ContractID,Property FROM
(
    SELECT c.ContractID, 
    Property = 
    (
        SELECT TOP 1 p.Name 
        FROM Com.Property p 
        JOIN VContract.Contract2Property c2p ON c2p.PropertyID=p.PropertyID 
        WHERE c2p.ContractID=c.ContractID
    ),
    ROW_NUMBER() OVER (ORDER BY Property) as RowNum
    FROM VContract.[Contract] c
) as sub
WHERE RowNum BETWEEN @StartRow AND ((@StartRow + @PageSize) - 1)
Run Code Online (Sandbox Code Playgroud)

问题是(ORDER BY Property)部分.我可以通过c.ContractID而不是Property来订购.那么如何才能实现这一目标呢?我需要查找属性的名称,然后我希望按该名称排序.

这用于填充网站,因此分页对我很重要,因此我可以限制一次返回多少条记录.

谢谢你的帮助.

mic*_*tan 5

尝试将您的呼叫转移到ROW_NUMBER()到您的外部查询:

    SELECT ContractID, Property, ROW_NUMBER() OVER (ORDER BY Property) as RowNum FROM
    (
        SELECT c.ContractID, 
        Property = 
        (
            SELECT TOP 1 p.Name 
            FROM Com.Property p 
            JOIN VContract.Contract2Property c2p ON c2p.PropertyID=p.PropertyID 
            WHERE c2p.ContractID=c.ContractID
        ),
        FROM VContract.[Contract] c
    ) as sub
Run Code Online (Sandbox Code Playgroud)

请注意,您可能必须将where子句拉出到另一层嵌套.


小智 5

我认为当使用带有 CTE 概念的子查询时,您将克服这个问题

WITH VContract AS
(
 SELECT ROW_NUMBER() OVER (ORDER BY Property) as RowNum, ContractID
 FROM
 (
   SELECT c.ContractID AS ContractID, 
     Property = 
     (
        SELECT TOP 1 p.Name 
        FROM Com.Property p 
        JOIN VContract.Contract2Property c2p ON c2p.PropertyID=p.PropertyID 
        WHERE c2p.ContractID=c.ContractID
     )    
    FROM VContract.[Contract] c
 )
)
SELECT ContractID FROM VContract 
WHERE RowNum BETWEEN @StartRow AND ((@StartRow + @PageSize) - 1)
Run Code Online (Sandbox Code Playgroud)