我有以下查询返回基于两个值的记录间隔
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
但是当我从子查询中删除顺序时,我得到了不同的结果:
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
问题出在哪里?
答案 0 :(得分:1)
顺序将在select top指令之前发生。因此,在您给出的示例中,它将按ID排序,然后选择前5个记录。这是一个子查询,因此外部查询将按ID降序排列这5条记录,然后选择前3条。
当您在子查询中删除订单时,前5个指令将只返回它遇到的前5个记录。这可能会受到聚集索引的影响,如果表中有一个聚合索引,那么如果ID是聚类的,它可能会给出相同的结果,但如果它是其他类似创建日期的东西会影响订单结果返回。请注意,即使考虑聚集索引,也无法保证订单无法保证。查询并行性也可能发挥作用。
基本上,检查表上的聚集索引,因为这可能表示订单但不能保证。希望这是有道理的。