2016-07-11 3 views
0

Этот вопрос касается оракула 12.1.0.2 на aix 7.2.счетчик числа оракулов sql вместе с другими столбцами

У меня есть 5 таблиц, и я хочу, чтобы сделать этот запрос:

select owner, table_name, LAST_DDL_TIME, count(*) 
from dba_objects 
where owner = 'WAREHOUSE' 
and OBJECT_NAME in ('table1','table2','table3','table4','table5') 
and OBJECT_TYPE = 'TABLE' 

Я хочу 3 столбцов в предложении выбора и фактического подсчета 5 таблиц. Я хочу сделать это в одном запросе, если это возможно.

Если я добавлю группу по собственнику, table_name, LAST_DDL_TIME, он вернет счет 1 для каждой строки.

Так что мой набор результатов я хочу будет выглядеть следующим образом:

OWNER  OBJECT_NAME  LAST_DDL_TIME   COUNT(*) 
SCHEMA1  TABLE1   7/9/2016 3:47:27 PM  5932158 
SCHEMA1  TABLE2   7/9/2016 3:47:31 PM  432 
SCHEMA1  TABLE3   7/9/2016 3:47:15 PM  958741 
SCHEMA1  TABLE4   7/9/2016 3:47:31 PM  11298 
SCHEMA1  TABLE5   7/9/2016 3:47:15 PM  3645873385 
+0

"фактическое количество 5 таблиц". Вы имеете в виду 5? Или вы ищете количество строк? – ruudvan

+0

Зачем вам нужен 'owner' в выходе, если вы фильтруете' owner = 'WAREHOUSE''? Кроме того - вам действительно нужен текущий счетчик (*) - считается, что в последний раз статистика была недостаточной? – mathguy

+0

Если вы просто хотите приблизительный счетчик, вы можете использовать 'dba_tab_statistics.num_rows'. Если вам нужен точный подсчет, вы можете написать функцию SQL, чтобы возвращать счетчик строк, если заданы владельцем и имя_таблицы в качестве параметров. Затем просто вызовите функцию SQL в своем элементе. –

ответ

-1

хак, используя только простой SQL и жестко закодированные владельца и таблицы имен, как показано ниже. Он не должен использоваться, если это не требование к жизни в течение одной недели.

Для тестирования я использовал SYS и несколько таблиц в схеме SYS на моей машине. Если вы найдете это полезным, вы можете адаптировать его для своей ситуации.

with 
    counts (table_name, ct) as (
     select 'ACCESS$'     , count(*) from SYS.ACCESS$    union all 
     select 'ALERT_QT'    , count(*) from SYS.ALERT_QT    union all 
     select 'APPLY$_CHANGE_HANDLERS' , count(*) from SYS.APPLY$_CHANGE_HANDLERS union all 
     select 'APPLY$_CONF_HDLR_COLUMNS', count(*) from SYS.APPLY$_CONF_HDLR_COLUMNS 
    ) 
select o.owner, o.object_name, o.last_ddl_time, c.ct 
from dba_objects o 
     inner join 
     counts c 
     on o.object_name = c.table_name 
where o.object_type = 'TABLE' 
    and o.owner = 'SYS' 
; 


OWNER OBJECT_NAME    LAST_DDL_T   CT 
-------- ------------------------- ---------- ---------- 
SYS  ACCESS$     2014-05-29  34698 
SYS  ALERT_QT     2014-05-29   0 
SYS  APPLY$_CHANGE_HANDLERS 2014-05-29   0 
SYS  APPLY$_CONF_HDLR_COLUMNS 2014-05-29   0 
0

Вы можете использовать некоторую магию XML для выполнения динамического SQL внутри простого SQL-запроса.

select owner, object_name, LAST_DDL_TIME, 
     to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from "'||owner||'"."'||object_name||'"')),'/ROWSET/ROW/C')) as count 
from dba_objects 
where owner = 'WAREHOUSE' 
and OBJECT_NAME in ('table1','table2','table3','table4','table5') 
and OBJECT_TYPE = 'TABLE' 
Смежные вопросы