我有一个简单的查询案例:
;WITH TEST_CTE AS
(
SELECT 1 N
UNION ALL
SELECT N + 1
FROM TEST_CTE
WHERE N < 50
)
SELECT N FROM TEST_CTE
ORDER BY N
OFFSET 10 ROWS
FETCH NEXT 5 ROWS ONLY
关键字ONLY
在这里是什么意思:
仅次于5行的FETCH 仅
为什么要在那里放它?
答案 0 :(得分:2)
如果在使用ORDER BY
时检查OFFSET
子句的syntax:
<offset_fetch> ::=
{
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[
FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
]
}
您会看到,如果只需要OFSET
行,则无需指定FETCH
的行数(剩下的全部都可以得到)。但是,如果要获得特定数量的行,则必须使用ONLY
关键字。
我尝试找出在SQL standard
中确切定义的位置,因为在许多情况下,这只是标准-看起来好像不需要的东西,但这是标准,人们正在尝试跟着它。因此,来自here:
由于ISO SQL:2008结果的限制可以如下指定 使用FETCH FIRST子句的示例。
选择*仅从前十行中获取
CA DATACOM / DB 11,IBM DB2,SAP当前支持此子句 SQL Anywhere,PostgreSQL,EffiProz,H2,HSQLDB 2.0版,Oracle 12c 和Mimer SQL。
Microsoft SQL Server 2008和更高版本支持FETCH FIRST,但是它是 被视为ORDER BY子句的一部分。 ORDER BY,OFFSET和 这种用法都需要使用FETCH FIRST子句。
选择*从按列排序的DESC偏移量0行获取优先10 仅行
您会看到ONLY
关键字似乎是标准定义的一部分。下表是一些实施不符合该标准的语法的表:
因此,对于SQL Server
,在使用only
和ORDER BY
时,必须使用FETCH
关键字。这似乎是在遵循标准,所以不要浪费太多时间来担心它。
答案 1 :(得分:1)
Prix
用于分页,即;只检索指定的一些行
OFFSET FETCH
因此,在这里按n排序时不会返回前10行,因为它被指定为offset。然后,它将仅返回剩余的5行
SELECT N FROM TEST_CTE
ORDER BY N
OFFSET 10 ROWS
FETCH NEXT 5 ROWS ONLY
用于指定所需的行。
如果未指定,则查询将跳过排序结果集中的前10行,并返回其余行。
如果只想偏移行,则仅使用use ONLY
关键字。
如果您需要限制返回的行数,请使用OFFSET
和FETCH