我有一个相当昂贵的查询,它会返回一个结果页面:
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子句线程化到它中,我真的不想将它选择到临时表中或只运行两次以计算页数。
任何想法?
答案 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;