2010-03-05 49 views
4

这里是我的查询:在SQL Server中如何将ROW_Number()与子查询列一起使用?

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) 

的问题是(ORDER BY财产)部分。我可以通过c.ContractID而不是Property来订购。 那么如何实现这一目标呢?我需要查找该房产的名称,然后我希望按照该名称进行分类。

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

感谢您的任何帮助。

+1

你意识到了'p.name'值可以是任何可用的值? – 2010-03-05 22:02:48

+0

是的。可以有一个或多个属性分配给合同。对于标题列表puposes,我只需列出其中一个就足够了。这是真实查询的简化版本,其中也包含属性数量。因此,它实际上显示如: ContractID,属性名(10) - 若要弄清楚有实际分配10种性质。您会在详细视图中看到完整的10个。 – user169867 2010-03-06 16:35:32

回答

4

试试你到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 

注意,你可能要拉你的where子句出来的嵌套另一层。

+0

我怎么看不到的WHERE子句分页,在这个问题可以在此查询应用。添加 “WHERE ROW_NUMBER)OVER(ORDER BY属性)(BETWEEN @StartRow AND((@StartRow + @PageSize) - 1)” 将给予 “窗函数只能出现在SELECT或ORDER BY子句。” Arulraj.M的答案是使用Common table表达式,得到了我的投票。 – 2013-02-04 09:43:31

+0

@R。 Scheurs - 这就是我对“你可能不得不将句子从另一层嵌套到另一层嵌套”的评论。 Arulraj的解决方案正是如此。 – micahtan 2013-02-06 16:56:54

+0

@micahtan - 你说得对,我错过了笔记。如果你编辑你的答案包括一个完整的SQL示例,包括嵌套,我会投票给你并删除我的评论(如果可能的话)。 – 2013-03-03 11:40:50

1

我没有试过,但是...我添加了限制行号

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) 
0

我猜的顺序由不起作用,因为它是选择子一个新的外层。

而不是做选择,以获得属性名的值一分,可你只是做与合同一起拿到的名字吗?然后你可以按名称订购。

4

我认为当与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) 
相关问题