在临时表中只有两列可用。我想获取每次加载的最新ID,如下图所示。
我已经尝试过,但它没有给我我需要的答案。
select max(rn_plus_1),a.load, a.id from( select a.load,
a.id,
ROW_NUMBER() over(order by a.id desc) rn from max_num a group by load
, id) a
TEMP_TABLE 缺少顺序主键或任何其他插入顺序指示符。因此,不可能使用表本身的列来获取 LOAD 的最新 ID。
但是,有一种选择:ORA_ROWSCN() https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/ORA_ROWSCN-Pseudocolumn.html#GUID-8071AAB0-F656-4C93-B926-0BCE1439F121。这是一个伪列,用于标识系统更改编号交易这改变了桌子。因此我们可以通过对ORA_ROWSCN上的表进行排序来重构插入顺序。
有一些注意事项:
- 默认情况下,SCN 适用于块级别。因此,块中的所有行都具有相同的 SCN。对于宽表来说,这是一个足够好的近似值,但对于像 TEMP_TABLE 这样的两列玩具来说,这是没有希望的。我们可以在行级别跟踪 SCN,但前提是该表是使用 ROWDEPENDENCIES 创建的。默认值为 NOROWDEPENDENCIES。不幸的是,我们不能在这里使用 ALTER TABLE。您将需要删除并重新创建该表(*)启用 ROWDEPENDENCIES。
- SCN 适用于事务。这意味着只有在 TEMP_TABLE 中的每一行都插入到单独的事务中时,该解决方案才有效。
- 显然,只有当 TEMP_TABLE 是实际表而不是视图或其他构造时,这才有可能。
鉴于满足所有这些条件,这里的查询将为您提供所需的结果集:
select load, id
from ( select load
, id
, row_number() over (partition by load order by ora_rowscn desc) as rn
from temp_table
)
where rn = 1
有。此外,除了使用 NOROWDEPENDENCIES 定义的 TEMP_TABLE 之外,还有相同的演示,其中.
(*)如果您需要将数据保留在 TEMP_TABLE 中,步骤如下:
rename TEMP_TABLE to whatever;
create table TEMP_TABLE as select * from whatever rowdependencies;
drop table whatever;
但是,现有行的 SCN 将相同。如果这很重要,您必须按照您希望保留的顺序一次插入每一行,并在每次插入后提交。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)