从多个表中查找多个列的最大值以更新序列

Finding max value of multiple columns from multiple tables to update Sequence

我遇到了一个问题,DBA 需要重新创建我的序列(必须使用 "NO CACHE" 创建)。不幸的是,他在获取当前值之前丢弃了序列!问题是,据我所知,几乎有 25 个 table 使用这个序列。我的计划是尝试找到每个主键 "ID" 字段的最大值,然后 运行 一个序列循环来获得顺序备份。

我现在希望做的是清理我的 "ugly" 流程以获得更精简的流程,我可以将其放入我的文档中(以防再次发生这种情况!)。

我最初的解决方案是执行如下操作:

SELECT 'TABLE_1','TABLE_1_ID', MAX(TABLE_1_ID) from TABLE_1
UNION ALL
SELECT 'TABLE_2','TABLE_2_ID', MAX(TABLE_2_ID) from TABLE_2
UNION ALL 
SELECT 'TABLE_3','TABLE_3_ID', MAX(TABLE_3_ID) from TABLE_3
UNION ALL 
...... (continue select statements for other 20+ tables)
SELECT 'TABLE_25','TABLE_25_ID', MAX(TABLE_25_ID) from TABLE_25
ORDER BY 2 DESC;

这显示有效,但将 table 最高的 "MAX" 放在顶部;但要清理它我想: 1. 尽可能简化查询(消除 UNION ALL) 2. 我真的很想 运行 查询 returns 单行..

  1. 这将是 'gravy',但我有一个循环将 运行 通过序列的下一个 val;该循环开始于:

    declare
    COL_MaxVal pls_integer;
    SEQ_Currval pls_integer default -1;
    
    BEGIN
       SELECT MAX(TABLE_X_ID) INTO COL_MaxVal
       FROM TABLE_X
       while SEQ_Currval < COL_MaxVal
         loop
         select My_Sequence_SEQ.nexval into SEQ_Currval
         from dual;
       end loop;
    end
    

    如果可能的话,我真的很想 运行 循环脚本,它会发现哪个 table/column 具有最高的最大值,然后在循环中使用那个 table将序列增加到最大值。

感谢任何帮助。

这是返回一行的解决方案:

    WITH all_data as
    (
        SELECT 'TABLE_1','TABLE_1_ID', MAX(TABLE_1_ID) as id from TABLE_1
        UNION ALL
        SELECT 'TABLE_2','TABLE_2_ID', MAX(TABLE_2_ID) from TABLE_2
        UNION ALL 
        SELECT 'TABLE_3','TABLE_3_ID', MAX(TABLE_3_ID) from TABLE_3
        UNION ALL 
        ...... (continue select statements for other 20+ tables)
        SELECT 'TABLE_25','TABLE_25_ID', MAX(TABLE_25_ID) from TABLE_25
    ),
    max_id as
    (
        SELECT max(id) as id FROM all_data
    )
    SELECT 
        ad.* 
    FROM 
        all_data ad 
    JOIN max_id mi ON (ad.id = mi.id)

我看不出任何更简单的解决方案...

如果还不算太晚,dba 可能会尝试对字典进行闪回查询。例如

SELECT * FROM dba_sequences AS OF TIMESTAMP systimestamp - 1/24;

您的安全值应该是 last_number+ 缓存大小。查看详细信息:

LAST_NUMBER on oracle sequence