2009-06-18 4 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) 

내가 뭘하고 싶은 것은 내가 총 페이지를 계산할 수 있도록 또한 내부 쿼리의 총 수를 반환합니다.

그러나 COUNT 절을 스레드에 연결하는 방법을 알아낼 수 없으며이 테이블을 임시 테이블로 선택하거나 페이지 수를 계산하기 위해 두 번 실행하지 않으려 고합니다.

어떤 아이디어?

답변

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

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

그와 같은 문제가 있는데 Count (R. *)는 다음과 같은 쿼리에서 허용되지 않습니다. ( – FlySwat

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; 
관련 문제