【问题标题】:Why does SELECT TOP 1 . . . ORDER BY return the second row in the table?为什么 SELECT TOP 1 。 . . ORDER BY 返回表中的第二行?
【发布时间】:2016-11-25 13:47:17
【问题描述】:

当我使用查询选择所有行时:

SELECT * 
FROM AFT_Contacts 
ORDER BY Tries

我看到了结果:

ID       Name     Area     Phone      Status    Tries    
------------------------------------------------------
117970   Adam     One      1111111111 New       0 
117971   Brian    Two      2222222222 New       0    
117972   Colin    Three    3333333333 New       0    
117973   David    Four     4444444444 New       0    
117974   Edward   Five     5555555555 New       0    
117975   Frank    Six      6666666666 New       0

但是查询:

SELECT TOP 1 * 
FROM AFT_Contacts 
ORDER BY Tries

返回:

ID       Name     Area     Phone      Status    Tries
-----------------------------------------------------    
117971   Brian    Two      2222222222 New       0

为什么它不返回 Adam 的详细信息,因为它们在表中排在首位?

【问题讨论】:

  • 感谢 marc_s 的编辑
  • 要获取 Adam 的详细信息,您需要使用 ORDER BY Tries, Name 来获取名字,以防在 Tries 值上绑定了几行

标签: sql sql-server tsql sql-order-by


【解决方案1】:

在关系数据库中,表没有内在的顺序。您提供的ORDER BY 在所有记录中并不明显,实际上在所有记录中都是相同的。所以返回结果的顺序仍然不是确定性和不可预测的。因此top 1 返回一个不可预测的行。

你说“Adam 的详细资料排在第一位”,这根本不是真的;表中的记录没有任何顺序地存储。如果您选择没有order by 或(如您的情况)order by 不确定,则返回的顺序是任意的。

【讨论】:

  • 答案的第一部分是好的。但不是第二个。 (1) 堆不是唯一的选择,行可能是有序的 (2) 优化器本身不处理执行,因此不确定顺序。实际上没有什么决定顺序,它是任意的。
猜你喜欢
  • 2011-09-11
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 2017-05-09
相关资源
最近更新 更多