2015-10-12 2 views
1

Я хочу написать запрос, который извлекает строки в каждой таблице, находящейся под определенным владельцем. Я не очень хорошо разбираюсь в запросах и поэтому не могу понять решение в Интернете. Запрос я пишу это:Извлечение количества записей в каждой таблице

SELECT TABLE_NAME, COUNT(*) FROM DBA_TABLES WHERE TABLE_NAME IN 
(SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER='ABC'); 

Я знаю, что запрос совершенно неправильно, но я только что дал его, чтобы знать, что именно я хочу. Я надеюсь, что это помогает. Ошибка, которую я получаю:

ORA-00937: not a single-group group function

Пожалуйста, помогите мне в письменной форме точный запрос для того же. Благодаря!

+0

'ВЫБОР TABLE_NAME, COUNT (*) ОТ DBA_TABLES ГДЕ ПРЕДПРИНИМАТЕЛЬ = ГРУППА«ABC»ПО TABLE_NAME' – Mihai

+0

«* Я хочу написать запрос, который извлекает строки в каждом таблицах, присутствующих в соответствии с конкретным владельцем *» Итак, вы хотите получать строки из таблиц или хотите получить информацию только метаданных? –

ответ

2

Распаковка количество записей в каждой таблице

Тогда вы полностью в неправильном направлении при запросе dba_tables. Он даст вам количество таблиц, принадлежащих пользователю, но не количество строк в каждой таблице.

Есть три способа:

  • В чистом SQL, имя таблицы должно быть статическим. т. е. вам придется явно указывать имена таблиц и получать счетчик.
 
SELECT COUNT(*) FROM table_1; 
SELECT COUNT(*) FROM table_2; 
SELECT COUNT(*) FROM table_3; 
... 
and so on... 

Используя хороший текстовый редактор, вы можете сделать это быстро.

  • Если статистика собирается до настоящего времени, то вы можете рассчитывать на NUM_ROWS в dba_tables. В любом случае лучше сначала собрать статистику, используя DBMS_STATS.
 
SQL> SELECT table_name, num_rows FROM dba_tables WHERE owner='SCOTT'; 

TABLE_NAME NUM_ROWS 
---------- ---------- 
CLASS    0 
SALGRADE   5 
BONUS    0 
DEPT    4 
EMP    14 
  • В PL/SQL, перебрать все имена таблиц, создавать динамические SQL и выполнение (AB) с помощью EXECUTE IMMEDIATE.
+0

Использование второго метода (NUM_ROWS) не работает. Я получаю еще один столбец на выходе с именем NUM_ROWS, но поля под тем же пустым для всех таблиц. – user3379410

+0

@ user3379410: тогда вы не собрали никакой статистики для своих таблиц. –

+0

тем, что вы имеете в виду, что в этом нет данных? – user3379410

0

При использовании функции группы (количество) вы должны поместить все столбцы, которые появляются в SELECT, а не в функции группы в разделе GROUP BY

SELECT TABLE_NAME, COUNT(*) 
FROM DBA_TABLES 
WHERE OWNER='ABC' 
GROUP BY TABLE_NAME; 

НО этот запрос не возвратит ничего интересного для вас. Это не количество строк. Это число таблиц в этой схеме.

0

Получение числа строк всех таблиц, можно сделать с помощью небольшой XML магии:

select owner, 
     table_name, 
     to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from "'||owner||'"."'||table_name||'"')),'/ROWSET/ROW/C')) as count 
from dba_tables 
where owner = 'ABC' 
    and iot_name is null; 

Это формирует select count(*) from .. для каждой таблицы, то «бежит», что через dbms_xmlgen и анализирует сгенерированный XML вывод для фактического числа.

dbms_xmlgen documentation

Смежные вопросы