从多个表中查找多个列的最大值以更新序列
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 单行..
这将是 '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
我遇到了一个问题,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 单行..
这将是 '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