Sql Select Top 1

I'm getting weird results from a table I'm selecting from. Consider the following table:

USERID    TICKETSASSIGNED

1         0  
100       0  
101       0  
102       0  
103       0  

Now, if I have the following sql as in:

SELECT TOP 1 USERID  
  FROM TABLEX  
  ORDER BY TICKETSASSIGNED

The result I would expect to get is "1" but most all the time I'm getting "100", the second record. Since TICKETSASSIGNED values are all "0", it randomly picks which one it thinks is TOP 1 since this is the field I'm ordering on. To get the correct value of "1" in this case, I had to also order on USERID.

Any ideas?

1

4 Answers

The result I would expect to get is "1" but most all the time I'm getting "100", the second record. Since TICKETSASSINGED values are all "0", it randomally picks which one it thinks is TOP 1 since this is the field I'm ordering on. To get the corredct value of "1" in this case, I had to also order on USERID.

This is default behavior in all SQL - there's no order guarantee if there's no ORDER BY clause, and in this case you're not ordering by pertinent data so the database arbitrarily picks a row.

Use:

ORDER BY TICKETSASSIGNED, USERID    

You would need a second column in your ORDER BY clause in this case:

SELECT TOP 1 USERID  
FROM TABLEX  
ORDER BY TICKETSASSIGNED, USERID

Without this it's probably giving you the records ordered by TICKETASSIGNED, then by their physical location in the table, e.g. the order they were inserted in most cases.

If you check the documentation for TOP: TOP (Transact-SQL), specifically the first two paragraphs under Remarks, it explicitly states that TOP does not order the rows. As such, the order you've imposed yourself is the one used.

Unfortunately, your ordering is incomplete. It only happens to produce what you want sometimes.

The correct way is exactly what you've figured out, you need to order by USERID as well.

If you are ordering only by TICKETSASSIGNED and they all have equal values, there is no reason any specific record should be returned as the top one. If you want to get the top one using USERID as the next field to order by, then yes, you should just add USERID to your order by clause.

1

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Maya Lin-Takahashi

Maya Lin-Takahashi

Consumer Tech & Gadget Reviewer

Maya is a hardware enthusiast who tests and reviews smart home devices, smartphones, wearables, and audio gear. She focuses on practical consumer value and build quality.

Share this article
Twitter Facebook Pinterest