Реализация функции подкачки (пропустить / взять) с помощью этого запроса


Я пытался понять немного о том, как реализовать пользовательскую подкачку в SQL, например, чтение статей, подобных этой.

У меня есть следующий запрос, который прекрасно работает. Но я хотел бы реализовать пейджинг с этим.

SELECT TOP x PostId FROM ( SELECT PostId, MAX (Datemade) as LastDate
 from dbForumEntry 
 group by PostId ) SubQueryAlias
 order by LastDate desc

чего я хочу

У меня есть сообщения на форуме, с соответствующими записями. Я хочу получить сообщения с последними добавленными записями, поэтому я могу выбрать недавно обсужденные посты.

теперь я хочу иметь возможность получить "топ-10 до 20 недавно активных сообщений", а не "топ-10".

что я пробовал

Я попытался реализовать функции строки как в статье, но на самом деле не повезло.

есть идеи, как это реализовать?

5 89

5 ответов:

на SQL Server 2012 очень просто

SELECT col1, col2, ...
 FROM ...
 WHERE ... 
 ORDER BY -- this is a MUST there must be ORDER BY statement
-- the paging comes here
OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

если мы хотим пропустить заказ, мы можем использовать

SELECT col1, col2, ...
  ...
 ORDER BY CURRENT_TIMESTAMP
OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

(Я бы предпочел отметить это как хак-но он используется, например, NHibernate. Чтобы использовать мудро подобранный столбец в порядке предпочтения)

ответить на вопрос:

--SQL SERVER 2012
SELECT PostId FROM 
        ( SELECT PostId, MAX (Datemade) as LastDate
            from dbForumEntry 
            group by PostId 
        ) SubQueryAlias
 order by LastDate desc
OFFSET 10 ROWS -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

новые ключевые слова offset и fetch next (только после стандартов SQL) были введены.

Но Я думаю, что вы не используете SQL Server 2012, да? В предыдущей версии это немного (немного) сложно. Вот сравнение и примеры для всех версий SQL server:здесь

так, это может работать в SQL Server 2008:

-- SQL SERVER 2008
DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 10,@End = 20;


;WITH PostCTE AS 
 ( SELECT PostId, MAX (Datemade) as LastDate
   ,ROW_NUMBER() OVER (ORDER BY PostId) AS RowNumber
   from dbForumEntry 
   group by PostId 
 )
SELECT PostId, LastDate
FROM PostCTE
WHERE RowNumber > @Start AND RowNumber <= @End
ORDER BY PostId

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

пример:

select * from table order by [some_column] 
offset 10 rows
FETCH NEXT 10 rows only

и вы не можете использовать ключевое слово "TOP" при этом.

вы можете узнать больше здесь: https://technet.microsoft.com/pt-br/library/gg699618%28v=sql.110%29.aspx

SQL 2008

ответ Радима Келера работает, но вот более короткая версия:

select top 20 * from
(
select *,
ROW_NUMBER() OVER (ORDER BY columnid) AS ROW_NUM
from tablename
) x
where ROW_NUM>10

Источник:https://forums.asp.net/post/4033909.aspx

OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

используйте это в конце вашего синтаксиса выбора. =)

вы можете использовать вложенный запрос для разбиения на страницы следующим образом: Подкачка из 4 строки в 8 строку, где CustomerId является первичным ключом

выберите топ 5 * от клиентов Где Страна= 'Германия' и CustomerId не в (выберите Top 3 CustomerID от клиентов Где Страна= 'Германия' заказ по городу) порядок по городу;