如何在这个查询中使用Count子句?

时间:2009-06-18 04:35:22

标签: tsql

我有一个相当昂贵的查询,它会返回一个结果页面:

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)

我想要做的还是返回内部查询的总数,以便我可以计算总页数。

但是,我无法弄清楚如何将COUNT子句线程化到它中,我真的不想将它选择到临时表中或只运行两次以计算页数。

任何想法?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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)

答案 2 :(得分: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;