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

Sql server 在SQL Server中,如何将ROW_Number()与子查询列一起使用?,sql-server,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

我的问题是:

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)
问题在于(按属性排序)部分。我可以按合同订餐,但不能按财产订餐。 那么,这怎么能解释呢?我需要查找属性的名称,然后我希望按该名称排序

这是用来填充一个网站,所以分页对我来说很重要,所以我可以限制一次返回多少条记录


谢谢您的帮助。

尝试将对第_行号码()的呼叫移动到外部查询:

    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

请注意,您可能需要将where子句拉到另一层嵌套中。

我没有尝试过这个,但是。。。我添加了一个新的外层来限制行数

SELECT ContractID,Property FROM  
(
  SELECT ContractID,Property, 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  
      ),  
      ROW_NUMBER() OVER (ORDER BY Property) as RowNum  
      FROM VContract.[Contract] c  
  ) as sub_inner
) as sub_outer
WHERE RowNum BETWEEN @StartRow AND ((@StartRow + @PageSize) - 1)  

我猜order by不起作用,因为它是一个子选择


您可以不执行子选择来获取属性名称的值,而直接执行join with Contract来获取名称吗?然后您可以按名称进行订购。

我认为,当使用带有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)

您知道
p.name
值可以是任何可用值吗?是。可以为合同分配一个或多个属性。对于标题列表puposes,我只要列出其中一个就足够了。这是real查询的简化版本,其中还包括属性计数。所以它实际上显示为:construcd,PropertyName(10)——为了清楚起见,实际上分配了10个属性。您将在详细视图中看到完整的10。我不知道问题中用于分页的WHERE子句如何应用于此查询。在@StartRow和(@StartRow+@PageSize)-1之间添加“WHERE ROW_NUMBER()(ORDER BY Property)”,将给出“窗口函数只能出现在SELECT或ORDER BY子句中。”。Arulraj.M的答案,使用一个通用的表表达式,得到了我的投票。@R.Scheurs-这就是我对“您可能必须将where子句拉到另一层嵌套”的评论的意思。阿鲁拉吉的解决方案正是这样。@micahtan-你说得对,我没注意到。如果您编辑您的答案以包含完整的sql示例(包括嵌套),我将投票支持您并删除我的注释(如果可能)。