2009-06-18 54 views
1

我有一個返回結果頁面相當昂貴的查詢:如何在此查詢中使用Count子句?

SELECT * FROM 
    (SELECT   
     ROW_NUMBER() OVER (ORDER BY j.PostDate DESC) as Row,            
     FROM 
      JobListing j, 
      Location l, 
      City c, 
      JobListing_Skill_XREF js, 
      @SkillTable st    
     WHERE 
      DistanceBetween(@lat,@long, c.Lat,c.Long) <= @miles AND 
      js.Skill_ID = st.id AND      
      j.location = l.id AND 
      j.id = js.JobListing_Id AND   
      l.CityID = c.Id    
    ) AS RESULTS 
    WHERE Row Between (@PageNumber - 1) * @PageSize + 1 and (@PageNumber * @PageSize) 

我想這樣做也返回內部查詢的總數,這樣我可以計算出總頁數。

然而,我無法弄清楚如何線程計數條款成這樣了,我真的不希望有這種選擇到一個臨時表或運行它兩次,只是爲了計算頁數。

什麼想法?

回答

1
SELECT * FROM 
     (SELECT     
       ROW_NUMBER() OVER (ORDER BY j.PostDate DESC) as Row, 
       COUNT(*) OVER() AS total 
       FROM 
         JobListing j, 
         Location l, 
         City c, 
         JobListing_Skill_XREF js, 
         @SkillTable st      
       WHERE 
         DistanceBetween(@lat,@long, c.Lat,c.Long) <= @miles AND 
         js.Skill_ID = st.id AND           
         j.location = l.id AND 
         j.id = js.JobListing_Id AND      
         l.CityID = c.Id       
     ) AS RESULTS 
     WHERE Row Between (@PageNumber - 1) * @PageSize + 1 and (@PageNumber * @PageSize) 
+0

你缺少第j *。但是當我補充說,它的工作。 – FlySwat 2009-06-18 14:17:27

0

使用CTE?喜歡的東西(不能明顯地測試:) ...

WITH R (Row) 
AS 
(
    SELECT         
    ROW_NUMBER() OVER (ORDER BY j.PostDate DESC) as Row, 
    FROM JobListing j, Location l, City c, JobListing_Skill_XREF js,@SkillTable st 
    WHERE DistanceBetween(@lat,@long, c.Lat,c.Long) <= @miles AND 
    js.Skill_ID = st.id AND 
    j.location = l.id AND 
    j.id = js.JobListing_Id AND 
    l.CityID = c.Id  
) 
SELECT R.*, COUNT(R.*) AS [Count] FROM R 
WHERE R.Row Between (@PageNumber - 1) * 
    @PageSize + 1 and (@PageNumber * @PageSize) 
+0

具有相同的問題,計數(R. *)是不允許這樣的查詢:( – FlySwat 2009-06-18 05:45:01

0

這是我能夠做到的,我很想知道,如果人們有更好的建議最好:

DECLARE @JobTable TABLE 
(
    ...snip... 
); 
INSERT INTO @JobTable 
    SELECT   
     ROW_NUMBER() OVER (ORDER BY j.PostDate DESC) as Row, 
     j.*      
     FROM 
      JobListing j, 
      Location l, 
      City c, 
      JobListing_Skill_XREF js, 
      @SkillTable st    
     WHERE 
      DistanceBetween(@lat,@long, c.Lat,c.Long) <= @miles AND 
      js.Skill_ID = st.id AND      
      j.location = l.id AND 
      j.id = js.JobListing_Id AND   
      l.CityID = c.Id 

SELECT * 
     FROM @JobTable 
     WHERE 
       Row BETWEEN 
       (@PageNumber - 1) * @PageSize + 1 
       AND (@PageNumber * @PageSize) 


SELECT @TotalRows = Count(1) FROM @JobTable; 
相關問題