T-SQL是Microsoft SQL Server使用的SQL语言的变体,没有limit
子句。它有一个select top {...}
修改,你看到的NHibernate趁着与SQL Server 2000
在SQL Server 2005,微软推出了Row_Number() over (order by {...})
功能,可以作为一个替代的limit
条款,你可以看到NHibernate的利用与SQL Server 2005/2008相比。
一种SQLite的查询可能看起来像
select c.[ID], c.[Name]
from [Codes] c
where c.[Key] = 'abcdef'
order by c.[Order]
limit 20 offset 40
而对于SQL Server 2005的一个类似的查询可能看起来像
select c.[ID], c.[Name]
from (
select c.[ID], c.[Name], c.[Order]
, [!RowNum] = Row_Number() over (order by c.[Order])
from [Codes] c
where c.[Key] = 'abcdef'
) c
where c.[!RowNum] > 40 and c.[!RowNum] <= 60
order by c.[Order]
,或者使用公用表表达式,它可能看起来像
with
[Source] as (
select c.[ID], c.[Name], c.[Order]
, [!RowNum] = Row_Number() over (order by c.[Order])
from [Codes] c
where c.[Key] = 'abcdef'
)
select c.[ID], c.[Name]
from [Source] c
where c.[!RowNum] > 40 and c.[!RowNum] <= 60
order by c.[Order]
还有一种方法可以在SQL Server 2000中执行它以及
select c.[ID], c.[Name]
from (
select top 20 c.[ID], c.[Name], c.[Order]
from (
select top 60 c.[ID], c.[Name], c.[Order]
from [Codes] c
where c.[Key] = 'abcdef'
order by c.[Order]
) c
order by c.[Order] desc
) c
order by c.[Order]
很好的答案@Justice。谢谢你的时间。 – 2009-10-31 15:01:53