Sql order by 和 select 最高执行顺序
Sql order by and select top execution order
我有以下查询 returns 基于两个值的记录区间
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
这是来自城市 table 的日期:
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 by 时,我得到了不同的结果:
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
问题出在哪里?
order by 将首先发生在 select top 指令之前。因此,在您给出的示例中,它将按 id 然后 select 前 5 条记录排序。这是一个子查询,因此外部查询将按 ID 降序排列这 5 条记录,然后 select 前 3 条。
当您在子查询中删除顺序时,top 5 指令将简单地 return 它遇到的前 5 条记录。如果 table 上有聚簇索引,则这可能会受到聚簇索引的影响,因此如果 ID 是聚簇索引,则可能会给出相同的结果,但如果它是创建日期之类的会影响顺序的其他内容,则结果为 return编辑。请注意,即使考虑到聚集索引,也不能保证订单上的内容。查询并行性也可能发挥作用。
基本上,检查 table 上的聚簇索引,因为这可能指示顺序但不能保证。希望这是有道理的。
我有以下查询 returns 基于两个值的记录区间
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
这是来自城市 table 的日期:
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 by 时,我得到了不同的结果:
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
问题出在哪里?
order by 将首先发生在 select top 指令之前。因此,在您给出的示例中,它将按 id 然后 select 前 5 条记录排序。这是一个子查询,因此外部查询将按 ID 降序排列这 5 条记录,然后 select 前 3 条。
当您在子查询中删除顺序时,top 5 指令将简单地 return 它遇到的前 5 条记录。如果 table 上有聚簇索引,则这可能会受到聚簇索引的影响,因此如果 ID 是聚簇索引,则可能会给出相同的结果,但如果它是创建日期之类的会影响顺序的其他内容,则结果为 return编辑。请注意,即使考虑到聚集索引,也不能保证订单上的内容。查询并行性也可能发挥作用。
基本上,检查 table 上的聚簇索引,因为这可能指示顺序但不能保证。希望这是有道理的。