2010-08-10 91 views
7

我從我選擇的表中得到奇怪的結果。下表考慮:Sql SELECT TOP 1

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

什麼是你的主鍵?數據實際上可能與正在顯示的結果不同。 – 2010-08-10 21:32:45

回答

3

您將需要第二列在這種情況下,您的ORDER BY條款:

SELECT TOP 1 USERID 
FROM TABLEX 
ORDER BY TICKETSASSIGNED, USERID 

如果沒有這一點,是可能給您TICKETASSIGNED訂購的記錄,然後通過它們的物理位置在表中,例如他們在大多數情況下被插入的順序。

0

如果您只訂購TICKETSASSIGNED並且它們都具有相同的值,那麼沒有理由將任何特定記錄作爲第一個返回。如果您想使用USERID作爲下一個字段進行排序,那麼您可以將USERID添加到您的訂單條款中。

+0

感謝您的快速回復。所有這一切都讓人心動 – 2010-08-10 22:29:37

8

我期望得到的結果是「1」,但大多數情況下我總是獲得第二條記錄「100」。由於TICKETSASSINGED值全部爲「0」,因此它會隨機選取它認爲是TOP 1的哪一個,因爲這是我訂購的字段。在這種情況下,爲了得到「1」的校正值,我還必須在USERID上命令。

這是所有SQL默認的行爲 - 沒有訂單的保證,如果沒有ORDER BY子句,在這種情況下你不通過相關數據的順序,使數據庫中任意挑選一排。

用途:

ORDER BY TICKETSASSIGNED, USERID  
5

如果您檢查TOP的文檔:TOP (Transact-SQL),特別是在以下備註欄中的前兩段,它明確指出,TOP不下令行。因此,你自己施加的順序就是使用的順序。

不幸的是,您的訂購是不完整的。它只是偶爾產生你想要的東西。

正確的方法正是你已經想出來的,你還需要通過USERID命令。

0

的SELECT TOP子句用於指定的記錄數返回

SELECT * FROM Customers LIMIT 3; 


customerId  CustomerName 
--------------------------- 
1     abc 
2     xyz 
3     mno