полный аналог LIMIT в MS SQL Server

MLT-Coder

Новичок
полный аналог LIMIT в MS SQL Server

суть проблемы в том что алгоритм типа

SELECT * FROM (
SELECT TOP x * FROM (
SELECT TOP x+y * FROM qwe ORDER BY id ASC
) as foo ORDER BY id DESC
) as bar ORDER BY id ASC

не работает если сумма x+y больше чем строк в таблице

пример таблица qwe содержит 4 строки
qwe
---
1
2
3
4

запрос типа
SELECT * FROM qwe LIMIT 3, 2
должен возвратить только одну последнюю строку

к сожалению этого не произойдет если использовать sql код для MS SQL Server-а
запрос
SELECT * FROM (
SELECT TOP 2 * FROM (
SELECT TOP 5 * FROM qwe ORDER BY id ASC
) as foo ORDER BY id DESC
) as bar ORDER BY id ASC
возвращает строки 3 и 4 (что совершенно не желательно)

чтобя все работало така как надо
необходимо уменьшить x на разницу x+y и количества строк в таблице

вот этот sql код каботает абсолютно идентично LIMIT из mysql

DECLARE @lr INT, @lo INT, @lolr INT, @nr INT, @sql nvarchar(1000)
SET @lr = 2
SET @lo = 3
SET @lolr = @lo + @lr
SET @nr = (SELECT COUNT(*) FROM qwe)
if @nr < @lolr SET @lr = @lr - (@lolr - @nr)
if @lr < 0 SET @lr = 0
SET @sql = 'SELECT * FROM (SELECT TOP ' + CAST(@lr AS VARCHAR(10)) + ' * FROM (SELECT TOP ' + CAST(@lolr AS VARCHAR(10)) + ' * from qwe ORDER BY id ASC) subquery1 ORDER BY id DESC) subquery2 ORDER BY id ASC'
EXEC sp_executesql @sql


что скажите на это?
замечания, предложения... может есть другие методы?
 
Сверху