SQL2000的写法一:

select QuestionId,CategoryId,Title from QA_Questions a where
a.QuestionId<=
(select max(c.QuestionId) from
(select top 3 QuestionId from QA_Questions b where b.CategoryId=a.CategoryId) c)
order by CategoryId

SQL2000的写法二:
select a.questionid,a.categoryid
from dbo.QA_Questions a
where Questionid in (select top 3 Questionid from QA_Questions where categoryid=a.categoryid
order by Questionid desc)order by a.categoryid asc


SQL2005的写法:
WITH NewTable AS(
SELECT *,RANK() OVER(PARTITION BY CategoryId Order BY QuestionId) RANK
FROM QA_Questions)
SELECT * FROM NewTable
WHERE RANK < 4

---以下是时间测试,结果为189:266
declare @t datetime ;set @t=getdate()
select * from QA_Questions a where
a.QuestionId<=
(select max(c.QuestionId) from
(select top 3 QuestionId from QA_Questions b where b.CategoryId=a.CategoryId) c)
order by CategoryId
select DateDiff( ms,@t,getdate());set @t=getdate()
begin
WITH NewTable AS(
SELECT *,RANK() OVER(PARTITION BY CategoryId Order BY QuestionId) RANK
FROM QA_Questions)
SELECT * FROM NewTable
WHERE RANK < 4
end
select DateDiff( ms,@t,getdate());set @t=getdate()
select a.questionid,a.categoryid
from dbo.QA_Questions a
where Questionid in (select top 3 Questionid from QA_Questions where categoryid=a.categoryid
order by Questionid desc)order by a.categoryid asc
select DateDiff( ms,@t,getdate())
本文介绍了两种不同的SQL查询方法,一种适用于SQL2000,另一种适用于SQL2005及以上版本。通过具体示例展示了如何从数据库中高效地选择每个类别下的前三条记录,并对比了不同查询方法的执行效率。
3962

被折叠的 条评论
为什么被折叠?



