2008-10-02 36 views
6

我正在使用sybase數據庫來查詢日常事務報告。我在我的腳本中有子查詢。有沒有什麼比如SELECT LAST在sql查詢中?

這裏,因爲它有云:

SELECT orders.accountid ,items.x,etc 
(SELECT charges.mistotal FROM charges where items.id = charges.id) 
FROM items,orders 
WHERE date = '2008-10-02' 

在這裏,我得到的錯誤消息:

子查詢不能返回多個值

我的值是7.50 ,25.00

我要回了25.00,但是當我使用

(SELECT TOP 1 charges.mistotal FROM charges where items.id = charges.id) 

我的結果是7.50,但我想回到25.00

有沒有人有任何更好的建議?

+0

爲什麼不發佈完整查詢並解釋如何選擇「最後」的charges.mistotal值。根據查詢的其餘部分以及「last」的含義,您可以用另一個連接和一個聚合函數替換子查詢。我們需要細節! :) – Matt 2008-10-03 03:03:31

回答

2

根據什麼標準選擇25.00而不是7.5?

如果它與最大值有關,則可以嘗試使用該字段上的MAX()函數。

如果它與按時間順序排列的最後一行相關,請嘗試在日期時間字段上使用MAX(),如果您有關於添加時間和分鐘的詳細信息。

1

你可以試試這個:

SELECT MAX(charges.mistotal) FROM charges WHERE items.id = charges.id 
9
SELECT TOP 1 * 
FROM dbo.YourTable 
ORDER BY Col DESC 

在你的情況,我想這將是

SELECT TOP 1 charges.mistotal 
FROM charges where items.id = charges.id 
ORDER BY charges.mistotal DESC 
+0

我想他想要輸入的最後一個訂單,而不是輸入的最大訂單... – CodeRedick 2008-10-02 02:36:49

0

SELECT TOP 1 charges.mistotal從那裏items.id =罪名指控。編號 ORDER BY charges.id DESC

order by子句將確保它按照ID和DESC意味着降序,因此它會首先給你最大(最新)的值。 TOP 1當然確保你得到那一個。

0

對您的子查詢進行排序。如果你想要「最後」的值,你需要定義你如何確定哪個項目最後出現(記住,默認情況下SQL結果集是無序的)。

例如:

(SELECT TOP 1 charges.mistotal FROM charges where items.id = charges.id 
ORDER BY charges.mistotal DESC) 

這將返回25.00,而不是7.50(從上面數據的例子),但我假設你希望這個值是「最後一次」,因爲它是更大的。可能有一些其他領域對你來說更有意義,例如,你可能有一個時間戳列,你可以對它進行排序以獲得最新的值而不是最大的值。關鍵在於定義「last」的含義。

+0

當我在我的子查詢中包含ORDER BY時,它給了我ORDER附近的語法錯誤...... – jbcedge 2008-10-02 00:18:59

1

所以,你可以用相反的順序:

(SELECT TOP 1 charges.mistotal 
    FROM charges 
    WHERE items.id = charges.id 
    ORDER BY charges.mistotal DESC 
) 

實際上,因爲你沒有給一個明確的順序,返回的結果的順序是不確定的,而你只是幸運的,它給你的回答你不想要的;它本可以給你你想要的答案,然後你可能沒有注意到它在投入生產之後並不總是正確的。

或者,你可以使用:

(SELECT MAX(charges.mistotal) 
    FROM charges 
    WHERE charges.id = items.id 
) 

還是你真的想要一個SUM?

1

要得到第一個使用select top 1 |首先*從表順序升序得到最後,只是顛倒你的訂單。

相關問題