Реализация функции подкачки (пропустить / взять) с помощью этого запроса
Я пытался понять немного о том, как реализовать пользовательскую подкачку в 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 ответов:
на 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
OFFSET 10 ROWS -- skip 10 rows FETCH NEXT 10 ROWS ONLY; -- take 10 rows
используйте это в конце вашего синтаксиса выбора. =)
вы можете использовать вложенный запрос для разбиения на страницы следующим образом: Подкачка из 4 строки в 8 строку, где CustomerId является первичным ключом
выберите топ 5 * от клиентов Где Страна= 'Германия' и CustomerId не в (выберите Top 3 CustomerID от клиентов Где Страна= 'Германия' заказ по городу) порядок по городу;