2011-09-23 68 views
1

我的分頁方法效率不高,因爲它會調用相同的查詢兩次,因此會加倍查詢時間。我目前調用1個查詢,連同5個表格一起使用XML搜索查詢,以允許從ASP.net傳遞列表。然後,我需要調用完全相同的查詢,除了用Count(row)來獲取記錄數量SQL + ASP.Net高效分頁

爲例(我已刪除的比特,使其更易於閱讀)

主查詢:

WITH Entries AS (
    select row_number() over (order by DateReady desc) 
    as rownumber, Columns..., 

from quote 

join geolookup as Pickup on pickup.geoid = quote.pickupAddress 

where 
    quote.Active=1 
    and //More 
) 
select * from entries 
where Rownumber between (@pageindex - 1) * @pagesize + 1 and @pageIndex * @pageSize 
end 

統計查詢:

select count(rowID)   
from quote 

join geolookup as Pickup on pickup.geoid = quote.pickupAddress 

where 
    quote.Active=1 
    and //More 
) 

回答

1

你可以選擇你的大查詢的結果到一個臨時表,那麼你就可以查詢該表中的行數和拔出你需要的行。

要做到這一點,添加(SELECT語句之後和之前的距離)

INTO #tmpTable 

然後引用您的表作爲#tmpTable


select row_number() over (order by DateReady desc) 
    as rownumber, Columns..., 
into #tmpTable 

from quote 

join geolookup as Pickup on pickup.geoid = quote.pickupAddress 

where 
    quote.Active=1 
    and //More 
) 

SELECT @Count = COUNT(*) FROM #tmpTable 

select * from #tmpTable 
where Rownumber between (@pageindex - 1) * @pagesize + 1 and @pageIndex * @pageSize 
+0

爲什麼你需要tmptable? - 你能不能把計數(*)放在第一個選擇中,這樣每一行都有計數呢? – michael

+0

不,因爲要做一個'COUNT(*)'你必須做一個'GROUP BY'聚合。 – cjk

1

您可以設置輸出參數將保存第一個查詢的行數。

你可以做類似

WITH Entries AS (
    select row_number() over (order by DateReady desc) 
    as rownumber, Columns..., 

from quote 

join geolookup as Pickup on pickup.geoid = quote.pickupAddress 

where 
    quote.Active=1 
    and //More 
) 

select @rowcount = max(rownumber) from entries 

select * from entries 
where Rownumber between (@pageindex - 1) * @pagesize + 1 and @pageIndex * @pageSize 

希望這有助於

+0

你不能叫CTE兩次,所以最後的陳述將失敗。 – cjk

+0

ahh ok,所以根據你的建議,你需要在選擇之前用結果填充臨時表,這樣你可以從中選擇兩次..很有意義。 – rabs