带有offset和fetch的SQL查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有offset和fetch的SQL查询相关的知识,希望对你有一定的参考价值。

我正在创建一个基本的ASP.net博客主页。我有两张桌子(下面给出的结构)。我需要这些表中的数据进行分页,所以我在查询中使用了offset和skip。

表格是:

表 - 博客:

Id(primary),
Description,
Data,
CreatedById,
CreatedDate,
ImageUrl,
IsDeleted,
Tags,
StatusId(value = 1 for draft and 2 for publish)

表 - BlogCategories:

Id,
BlogId(foreign key to table 1),
CategoryId

我已经在这些表中有数据了。我使用以下查询来获取数据

Select *
from Blog b inner join
     BlogCategories bc
     on b.Id = bc.BlogId
where b.StatusId = 2 and bc.CategoryId = 2 and b.IsDeleted = 0
ORDER BY b.CreatedDate desc
OFFSET     73 ROWS      
FETCH NEXT 9 ROWS ONLY;

此查询返回0行,但如果我从where子句中删除statusId和CategoryId,则查询将返回特定数量的行。

预期的结果是:

Expected result

我做错了什么还是有更好的方法。请帮我解决一下这个。谢谢。

答案

OFFSET用于省略特定数量的行,FETCH NEXT用于获取在偏移之后的一定数量的行,这里的顺序是保留行的顺序,以便您准确地得到您期望获得的行,因此如果你的查询没有给出输出,那么它意味着你在偏移73行之后没有行,在你的情况下,查询只给出7行,因此你没有得到输出。

另一答案

只有7行满足这个条件

b.StatusId = 2 and bc.CategoryId = 2 and b.IsDeleted = 0

如果要跳过73行结果并仍然获得一些行,则必须向数据库添加更多数据。

以上是关于带有offset和fetch的SQL查询的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL :TOP和OFFSET-FETCH筛选

SQL Server 2012使用Offset/Fetch Next实现分页

SQL2012分页offset fetch 比较SQL2005/2008的ROW_Number

SQL Server 2005相当于OFFSET / FETCH [重复]

带有游标参数 (LOOP FETCH) 和 For 循环子查询的 PL/SQL 查询出错

带有 LIMIT 和 OFFSET 的 SQL 排序依据。一次对每个匹配的行进行排序