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

时间:2011-08-03 23:51:51

标签: sql oracle aggregate

我的每个表都有一个“id”字段。鉴于表格列表可能会发生变化,我需要能够在所有这些内容中找到最高的ID。

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

P.S。这是为了更新已经失败的序列。

3 个答案:

答案 0 :(得分:11)

这是一些简单的动态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>

如果序列服务表跨多个模式,则需要驱逐ALL_TAB_COLUMNS并在查询中包含OWNER。

答案 1 :(得分:1)

这个怎么样?

 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。

答案 2 :(得分:-1)

如何查询驱动CURRVAL的id的序列......

如果你还需要查找id所在的表,那么构建一个新表来集中跟踪id并添加触发器以填充插入。