2015-10-12 50 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

'SELECT TABLE_NAME,COUNT(*)FROM DBA_TABLES WHERE OWNER = 'ABC' GROUP BY 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_ROWSDBA_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,遍歷所有表名,使用EXECUTE IMMEDIATE創建動態SQL和執行(AB)。
+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