所有表的最大列值

时间:2016-05-09 09:07:55

标签: sql oracle

可以在下面的脚本中添加一个特定列的最大值(每个列都有相同名称的列):

select 
  owner, 
  table_name, 
  round((num_rows*avg_row_len)/(1024*1024)) MB,
  num_rows "ROWS",
  last_analyzed
--max(data_for_each_column)
from all_tables 
where owner = 'OAP'
order by table_name asc

Example

1 个答案:

答案 0 :(得分:2)

如果所有表都有一个公共列,则可以使用带有XML的hack为每个表动态创建select max()

select owner, 
       table_name, 
       round((num_rows*avg_row_len)/(1024*1024)) MB,
       num_rows "ROWS",
       last_analyzed,
       dbms_xmlgen.getxmltype('SELECT max(id) m FROM '||owner||'.'||table_name).extract('//text()').getnumberval() as max_id
from all_tables tbl
where owner = 'OAP'
  and exists (select 1 
              from all_tab_columns ac
              where ac.owner = tbl.owner
                and ac.table_name = tbl.table_name
                and ac.column_name = 'ID')
order by table_name asc;

您需要使用正确的列名替换max(id)

如果至少有一个表没有名为id的列,则查询将失败 - 它不会只是"跳过"那张桌子。使用and exists (..)条件仅使用具有名为ID的列的表。

dbms_xmlgen.getxmltype()将运行传递的SQL查询并返回结果集的XML表示,如:

<ROWSET>
 <ROW>
  <M>42</M>
 </ROW>
</ROWSET>

extract('//text()')只是提取结果中的(仅)文本值'42',而getnumberval()会将其转换为实数。