假设我想用SQL(Sybase)执行此操作:查找具有最新时间戳的记录的所有字段。
写一种方法就是这样:
select * from data where timestamp = (select max(timestamp) from data)
这有点傻,因为它导致两个查询 - 首先找到最大时间戳,然后找到该时间戳的所有数据(假设它是唯一的,是的 - 我确实有时间戳索引)。更多它似乎没有必要,因为max()已经找到了我感兴趣的行,所以再次寻找它是浪费。
有没有办法直接访问max()返回的行的字段?
编辑:我看到的所有答案基本上都是聪明的黑客 - 我正在寻找一种语法方式来执行类似max(field1).field2的操作来访问max field1
答案 0 :(得分:4)
SELECT TOP 1 * from data ORDER BY timestamp DESC
答案 1 :(得分:0)
你能试试吗
SELECT TOP 1 *
FROm data
ORDER BY timestamp DESC
答案 2 :(得分:0)
您正在假设Sybase如何优化查询。如你所知,它可能正是你想要它做的 - 它可能会注意到两个查询来自“数据”,条件是“where =”,并且可以按照你的建议进行优化。
我知道在SQL Server的情况下,可以配置索引以包含索引行中的字段。通过这样的索引进行选择会使这些字段可用。
答案 3 :(得分:0)
这是SQL服务器,但你会明白这一点。
SELECT TOP(1) * FROM data
ORDER BY timestamp DESC;
答案 4 :(得分:0)
不,使用聚合意味着您正在自动分组,因此即使该组恰好包含一行,也没有一行可以获取数据。
您可以按字段排序并获取第一行:
set rowcount 1
select * from data order by timestamp desc
(请注意,不应使用select *
,而应指定查询所需的字段。这会使查询对数据库布局的更改缺乏敏感性。)