Oracle SQL在所有表中查找最高ID

Oracle SQL在所有表中查找最高ID,sql,oracle,aggregate,Sql,Oracle,Aggregate,我的每个表都有一个“id”字段。考虑到表列表可能会更改,我需要能够在所有表中找到最高的ID 有没有办法获取oracle数据库中的表列表,聚合它们的行(仅ID),然后获取max() 顺便说一句,这是用来更新一个发生故障的序列。这个怎么样 SELECT MAX(ID) FROM ( SELECT MAX(ID) AS ID FROM CUSTOMER UNION ALL SELECT MAX(ID) AS ID FROM EMPLOYEE UNION ALL

我的每个表都有一个“id”字段。考虑到表列表可能会更改,我需要能够在所有表中找到最高的ID

有没有办法获取oracle数据库中的表列表,聚合它们的行(仅ID),然后获取
max()

顺便说一句,这是用来更新一个发生故障的序列。

这个怎么样

 SELECT MAX(ID) 
 FROM
 (
    SELECT MAX(ID) AS ID FROM CUSTOMER
    UNION ALL 
    SELECT MAX(ID) AS ID FROM EMPLOYEE
    UNION ALL 
    SELECT MAX(ID) AS ID FROM MANAGER
 ); 

对需要搜索的所有表重复UNION ALL。

查询驱动当前id的序列如何


如果还需要找出该id所在的表,则构建一个新表以集中跟踪该id,并添加触发器以在插入时填充。

以下是一些简单的动态SQL驱动数据字典:

SQL> set serveroutput on
SQL> declare
  2      l_id pls_integer;
  3      max_id pls_integer;
  4      max_tab_name varchar2(30);
  5  begin
  6      max_id := 0;
  7      for r in ( select table_name
  8                 from user_tab_columns
  9                 where column_name = 'ID' )
 10      loop
 11          execute immediate 'select max(id) from '||r.table_name
 12              into l_id;
 13          if l_id > max_id
 14          then
 15              max_id := l_id;
 16              max_tab_name := r.table_name;
 17          end if;
 18      end loop;
 19      dbms_output.put_line('Highest score = '||max_id||' table='||max_tab_name);
 20  end;
 21  /
Highest score = 2010070705 table=SESSIONS

PL/SQL procedure successfully completed.

SQL>

如果sequence services表跨多个架构,则需要删除所有的\u TAB\u列,并在查询中包含OWNER。

p.s.我真诚希望您使用的是序列,而不是询问此问题,因为您希望为下一次插入增加id…这是为了更新序列!如果是oracle序列,那么这是一次性的工作,您不需要管理新的或更改的表。如果是您自己的序列,则转换为oracle序列:)CURRVAL仅适用于已通过NEXTVAL调用调用该序列的会话。我们可以使用
从用户\u序列中选择最后一个\u编号
获得序列的当前界限。但是,在某些情况下,如果没有使用序列来分配主键值(例如大容量数据加载过程),这将不会有帮助。然后,使用该序列的例程将生成冲突。我认为情况就是这样。这非常接近,但我正在寻找一个声明,如果我添加更多的表,它仍然有效,并且不需要每次添加一个表时都进行更新。有什么办法吗?我最初得到了一个
ORA-01426:numeric overflow
,但我将l_id和max_id类型更改为
numeric
,与我的id列内联,这非常有效。非常感谢!