我希望在ANSI SQL中实现分页查询。
我在SQL Server中尝试了以下查询,但不允许这样做:
select top 20 * from MyTable order by id
except
select top 10 * from MyTable order by id
Run Code Online (Sandbox Code Playgroud)
但是以下工作正常:
select top 20 * from MyTable
except
select top 10 * from MyTable order by id
Run Code Online (Sandbox Code Playgroud)
例如:
input expected result
20 11
11 13
25 14
6 16
4 17
2 18
1 19
9 20
3 25
7
8
16
17
18
13
14
19
10
5
Run Code Online (Sandbox Code Playgroud)
从上面的示例可以看出,如果我们不能编写第一个ORDER BY子句,那么结果将不会具有值20、11、25。
我同意,这应该order by与top仍然产生一个表一起工作(因为正好order by产生一个游标,因此不能用作选择源)。
当然,您可以轻松解决此限制:
select * from (select top 20 * from MyTable order by id) x
except
select * from (select top 10 * from MyTable order by id) y
Run Code Online (Sandbox Code Playgroud)
该order by子句只需在运算符比较最后出现的查询之后出现一次except。order by是逻辑查询处理阶段中要评估的最后一个子句。