2009-12-10 52 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;