2010-03-05 46 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) 
相關問題