SQL查询语句:选择第一条记录

21
我从一个表格中选择数据时得到了奇怪的结果。考虑以下表格:
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 排序。

有任何想法吗?


什么是你的主键?数据实际存储方式可能与显示的结果不同。 - Jerod Houghtelling
4个回答

15
我期望得到的结果是 "1",但大多数情况下我得到的是第二行记录的值 "100"。因为 TICKETSASSINGED 的值都是 "0",所以它会随机选择一个它认为是 TOP 1 的行,因为这是我正在排序的字段。为了在这种情况下获得正确的值 "1",我还必须按 USERID 进行排序。
这是所有 SQL 中的默认行为 - 如果没有 ORDER BY 子句,则没有排序保证,并且在这种情况下,您没有按相关数据排序,因此数据库会随意选择一行。
使用:
ORDER BY TICKETSASSIGNED, USERID    

6
在这种情况下,您需要在ORDER BY子句中添加第二列:
SELECT TOP 1 USERID  
FROM TABLEX  
ORDER BY TICKETSASSIGNED, USERID

如果没有这个设置,可能会按照TICKETASSIGNED的顺序给出记录,然后按照它们在表中的物理位置排序,例如它们插入的顺序。


6
如果您查看TOP的文档:TOP (Transact-SQL),特别是备注下的前两段,明确指出TOP不对行进行排序。因此,您自己施加的顺序就是所使用的顺序。
不幸的是,您的排序是不完整的。它只有在某些情况下才能产生您所期望的结果。
正确的方法就像您已经发现的那样,您需要按USERID排序。

0
如果您只按TICKETSASSIGNED排序,并且它们的值都相等,那么没有理由返回任何特定记录作为顶部记录。如果您想使用USERID作为下一个排序字段来获取顶部记录,则应该将USERID添加到您的排序子句中。

感谢您的快速回复,所有内容都很有道理。 - David W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接