我从我正在选择的表中得到了奇怪的结果。请考虑下表:
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
上订购。
有什么想法吗?
答案 0 :(得分:10)
我期望得到的结果是“1”,但大多数时候我得到的是“100”,第二个记录。由于TICKETSASSINGED值都是“0”,因此它会随机选择它认为是TOP 1的那个,因为这是我订购的字段。要在这种情况下获得corredct值“1”,我还必须在USERID上订购。
这是所有SQL中的默认行为 - 如果没有ORDER BY子句,则没有订单保证,在这种情况下,您不会按相关数据排序,因此数据库会随意选择一行。
使用:
ORDER BY TICKETSASSIGNED, USERID
答案 1 :(得分:5)
如果您查看TOP
:TOP (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
。