gpt4 book ai didi

sql - 如何从表中检索最后 2 条记录?

转载 作者:行者123 更新时间:2023-12-02 15:38:58 26 4
gpt4 key购买 nike

我有一个表,有n条记录

如何在不使用派生表的情况下从我的 SQL 表中检索第 n 条记录和第 (n-1) 条记录?

我试过使用 ROWID 作为

select * from table where rowid in (select max(rowid) from table);

它给出了第 n 条记录,但我也想要第 (n-1) 条记录。还有除了使用max,derived table and pseudo columns

以外的其他方法吗

谢谢

最佳答案

您不能依赖 rowid 来找到表中的最后一行。您需要一个自动递增的 ID 或创建时间才能进行正确的排序。

你可以使用,例如:

select *
from (select t.*, row_number() over (order by <id> desc) as seqnum
from t
) t
where seqnum <= 2

虽然在语法中允许,子查询中的 order by 子句将被忽略(例如 http://docs.oracle.com/javadb/10.8.2.2/ref/rrefsqlj13658.html )。

需要说明的是,rowid 与表中行的顺序无关。 Oracle 文档非常清楚,它们指定了数据的物理访问路径 (http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i6732) .的确,在空数据库中,将记录插入新表可能会创建一个单调递增的行 ID 序列。 但您不能依赖于此。rowid 的唯一保证是它们在表中是唯一的,并且是访问特定行的最快方式。

我不得不承认,我找不到关于 Oracle 在其最新版本中处理或不处理子查询中的顺序的良好文档。 ANSI SQL 不需要兼容的数据库来支持 order by in 子查询。 Oracle 语法允许这样做,至少在某些情况下它似乎可以工作。我最好的猜测是,它可能会在单处理器、单线程 Oracle 实例上工作,或者如果数据访问是通过索引进行的。一旦引入并行性,结果可能不会排序。自从我开始使用 Oracle(在 20 世纪 90 年代中期)以来,我的印象是子查询中的 order bys 通常被忽略。我的建议是不要依赖于功能,直到 Oracle 明确声明它受支持。

关于sql - 如何从表中检索最后 2 条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11703844/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com