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

时间:2016-03-02 15:45:06

标签: sql oracle11g sequence

我有一个问题,DBA需要重新创建我的序列(必须创建“NO CACHE”。不幸的是,他在获取当前值之前删除了序列!问题是,据我所知,几乎有使用此序列的25个表。我的计划是尝试找到每个主键“ID”字段的最大值,然后运行序列循环以重新启动序列。

我现在希望做的是清理我的“丑陋”流程以获得更简化的流程,我可以将其放入我的文档中(如果再次发生这种情况!)。

我的原始解决方案是执行以下操作:

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;

这显示有效,但将最高“MAX”的表放在顶部;但要清理它我想: 1.如果可能,简化查询(消除UNION ALL) 我真的很想只运行返回单行的查询..

  1. 这将是“肉汁”,但我有一个循环将贯穿序列的下一个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
    

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

  2. 感谢您的任何帮助。

2 个答案:

答案 0 :(得分:0)

以下是返回一行的解决方案:

    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)

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

答案 1 :(得分:0)

如果还不晚,那么dba可能会尝试对字典进行闪回查询。 E.g。

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

您的安全值应为last_number +缓存大小。详见:

LAST_NUMBER on oracle sequence