T-SQL, вариант языка SQL, который использует Microsoft SQL Server, не имеет предложения limit
. Он имеет модификатор select top {...}
, который, как вы видите, использует NHibernate с SQL Server 2000.
В SQL Server 2005 компания Microsoft представила функцию 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]
или, используя Common Table Expressions, это может выглядеть как
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]