2009-06-18 51 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; 
相关问题