Sql SELECT TOP 1

时间:2010-08-10 21:28:49

标签: sql

我从我正在选择的表中得到了奇怪的结果。请考虑下表:

USERID    TICKETSASSIGNED

1         0  
100       0  
101       0  
102       0  
103       0  

现在,如果我有以下sql:

SELECT TOP 1 USERID  
  FROM TABLEX  
  ORDER BY TICKETSASSIGNED

我期望得到的结果是“1”,但大多数时候我得到的是“100”,第二个记录。由于TICKETSASSIGNED值都是“0”,它会随机选择它认为是TOP 1的那个,因为这是我订购的字段。要在这种情况下获得正确的值“1”,我还必须在USERID上订购。

有什么想法吗?

4 个答案:

答案 0 :(得分:10)

  

我期望得到的结果是“1”,但大多数时候我得到的是“100”,第二个记录。由于TICKETSASSINGED值都是“0”,因此它会随机选择它认为是TOP 1的那个,因为这是我订购的字段。要在这种情况下获得corredct值“1”,我还必须在USERID上订购。

这是所有SQL中的默认行为 - 如果没有ORDER BY子句,则没有订单保证,在这种情况下,您不会按相关数据排序,因此数据库会随意选择一行。

使用:

ORDER BY TICKETSASSIGNED, USERID    

答案 1 :(得分:5)

如果您查看TOPTOP (Transact-SQL)的文档,特别是备注下的前两个段落,则会明确指出TOP不会对行进行排序。因此,您自己强加的订单就是使用的订单。

不幸的是,您的订购不完整。它只会产生你想要的东西。

正确的方法正是您已经想到的,您还需要通过USERID订购。

答案 2 :(得分:4)

在这种情况下,您需要在ORDER BY子句中添加第二列:

SELECT TOP 1 USERID  
FROM TABLEX  
ORDER BY TICKETSASSIGNED, USERID

如果没有这个,可能为您提供TICKETASSIGNED订购的记录,然后是表格中的实际位置,例如:在大多数情况下他们被插入的顺序。

答案 3 :(得分:0)

如果您只按TICKETSASSIGNED订购并且它们都具有相同的值,则没有理由将任何特定记录作为最高记录返回。如果您希望使用USERID作为下一个要排序的字段来获得最高排名,那么是的,您应该只在您的order by by子句中添加USERID