【问题标题】:Date of max id: sql/oracle optimizationmax id 的日期:sql/oracle 优化
【发布时间】:2010-01-21 20:22:54
【问题描述】:

有什么更优雅的方法:

select date from table where id in (
  select max(id) from table);

肯定有更好的方法...

【问题讨论】:

    标签: sql oracle query-optimization


    【解决方案1】:

    您可以使用ROWNUM 伪列。子查询是在找到第一行之前对结果进行排序的必要条件:

    SELECT date 
    FROM (SELECT * FROM table ORDER BY id DESC)
    WHERE ROWNUM = 1;
    

    您可以通过以下方式在 Oracle 9i 及更高版本中使用subquery factoring

    WITH ranked_table AS (
        SELECT ROWNUM AS rn, date
        FROM table
        ORDER BY id DESC
    )
    SELECT date FROM ranked_table WHERE rn = 1;
    

    您可以使用自连接,并查找不存在具有更大 id 的行:

    SELECT date
    FROM table t1
    LEFT OUTER JOIN table t2
      ON t1.id < t2.id
    WHERE t2.id IS NULL;
    

    哪种解决方案最好取决于表中的索引以及数据的数量和分布。您应该测试每个解决方案,以确定最有效、最快、最灵活满足您的需求等。

    【讨论】:

    • 嗯...我想我要发布另一个关于此的问题。我以前从未见过排名表。
    • 对于任何对此投票的人,请参阅stackoverflow.com/questions/2112891/… 我对此有一个后续问题,我认为单独使用它比尝试使用 cmets 更好......
    【解决方案2】:
    select date from (select date from table order by id desc) 
    where rownum < 2
    

    假设您的 ID 是唯一的。

    编辑:使用子查询 + rownum

    【讨论】:

    • Oracle 对 rownum 的排序总是让我抓狂。 ://
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 2012-07-26
    相关资源
    最近更新 更多