我有以下查询,它根据两个值返回记录的间隔
SELECT TOP 3
a.*
FROM
(SELECT TOP 5
ID, Name, CountryCode
FROM city
ORDER BY ID) a
ORDER BY
ID desc结果:
ID Name CountryCode
5 Amsterdam NLD
4 Mazar-e-Sharif AFG
3 Herat AFG这是来自城市表的日期:
ID Name CountryCode
1 Kabul AFG
2 Qandahar AFG
3 Herat AFG
4 Mazar-e-Sharif AFG
5 Amsterdam NLD
6 Rotterdam NLD
7 Haag NLD
8 Utrecht NLD
9 Eindhoven NLD
10 Tilburg NLD
11 Groningen NLD
. . .
. . .
4076 Hebron PSE
4077 Jabaliya PSE
4078 Nablus PSE
4079 Rafah PSE但是,当我从子查询中移除order时,会得到一个不同的结果:
SELECT TOP 3
a.*
FROM
(SELECT TOP 5
ID, Name, CountryCode
FROM city) a
ORDER BY
ID asc结果:
ID Name CountryCode
4079 Rafah PSE
4078 Nablus PSE
4077 Jabaliya PSE问题出在哪里?
发布于 2015-10-19 16:14:43
order将首先发生在select top指令之前。因此,在您已经给出的示例中,它将按id的顺序排序,然后选择前5条记录。这是一个子查询,因此外部查询将按ids降序这5条记录,然后选择前3条。
当您在子查询中删除order时,top 5指令只返回它遇到的前5条记录。如果表中有聚集索引,这可能会受到聚集索引的影响,因此,如果ID是聚集的,则可能会给出相同的结果,但如果像创建日期那样影响到顺序,则返回结果。请注意,即使考虑到聚集索引,也不能保证它在订单上得到保证。查询并行性也可能发挥作用。
基本上,检查表上的聚集索引,因为这可能指示顺序,但不能保证顺序。希望这是合理的。
https://stackoverflow.com/questions/33219040
复制相似问题