2009-12-10 86 views
0

假設我想用SQL(Sybase)執行此操作:使用最新的時間戳記查找記錄的所有字段。編寫獲取有關SQL max查詢結果的其他信息

一種方法是這樣的:

select * from data where timestamp = (select max(timestamp) from data) 

這是一個有點傻,因爲它會導致兩個查詢 - 首先要找到最大的時間戳,然後找到該時間戳的所有數據(假設它是唯一的,是的 - 我有一個時間戳索引)。更重要的是,它似乎沒有必要,因爲max()已經找到了我感興趣的行,所以再次查找它是浪費的。

有沒有辦法直接訪問max()返回的行的字段?

編輯:所有答案我看到的基本上都是聰明的黑客 - 我一直在尋找做一些像MAX(字段1).field2的語法方式來訪問該行的字段2,最大字段1

回答

0

沒有,使用聚合意味着你會自動分組,所以沒有單個行從即使該組恰好包含單行獲取數據。

您可以通過現場訂購併獲得第一行:

set rowcount 1 
select * from data order by timestamp desc 

(請注意,你不應該使用select *,而是指定您從查詢所需的字段這使得查詢較少。對數據庫佈局的變化很敏感。)

4
SELECT TOP 1 * from data ORDER BY timestamp DESC 
+0

* upvote * - 這是第一個也是正確的答案,但不適用於sybase – naumcho 2009-12-10 20:14:12

+0

請注意,如果您有多個具有相同時間戳的行,則只會獲得一個,未定義哪一個你會得到。這取決於你的應用程序是否可能。 – 2009-12-10 20:14:26

+0

TOP至少在版本12.5和可能從12版本的Sybase(ASE)中肯定可用。 – AdamH 2009-12-16 22:09:01

0

你可以試試這個:

SELECT TOP 1 * 
FROm data 
ORDER BY timestamp DESC 
0

你對Sybase如何優化查詢做了一些假設。對於你所知道的,它可能正是你想要它做的事 - 它可能會注意到兩個查詢都來自「數據」,並且條件是「where =」,並且可能會按照你的建議進行優化。

我知道在SQL Server的情況下,可以配置索引以包含索引行中的字段。通過這樣的索引做選擇會使這些字段可用。

0

這是SQL服務器,但你會明白。

SELECT TOP(1) * FROM data 
ORDER BY timestamp DESC;