2016-11-25 62 views
1

我想使用dba_tab_statistics連接從dba_tables中獲取表名。查詢從oracle的dba_tables中獲取表名

select table_name 
from dba_tables a, 
    dba_tab_statistics b 
where a.owner like 'Owner' and a.table_name not like '%TMP' 
    and a.LAST_ANALYZED IS NOT NULL and a.table_name = b.table_name 
    and b.stattype_locked IS NULL; 

此查詢不提供不同的表名稱。需要進行哪些更改?

+1

根本就'選擇DISTINCT'。 – jarlh

+4

今天提示:切換到現代,明確的'JOIN'語法。易於編寫(沒有錯誤),更易於閱讀(和維護),並且在需要時更容易轉換爲外部聯接。 – jarlh

回答

1

使用其中任何一個:

SELECT a.table_name 
    FROM dba_tables a, 
     dba_tab_statistics b 
WHERE  a.owner LIKE 'Owner' 
     AND a.table_name NOT LIKE '%TMP' 
     AND a.LAST_ANALYZED IS NOT NULL 
     AND a.table_name = b.table_name 
     AND b.stattype_locked IS NULL 
group by a.table_name ; 

SELECT DISTINCT a.table_name 
    FROM dba_tables a, 
     dba_tab_statistics b 
WHERE  a.owner LIKE 'Owner' 
     AND a.table_name NOT LIKE '%TMP' 
     AND a.LAST_ANALYZED IS NOT NULL 
     AND a.table_name = b.table_name 
     AND b.stattype_locked IS NULL ; 
0

另一種解決方案:

SELECT table_name 
    FROM dba_tables a 
WHERE owner LIKE 'Owner' 
    AND table_name NOT LIKE '%TMP' 
    AND LAST_ANALYZED IS NOT NULL 
    AND exists (SELECT 0 
       FROM dba_tab_statistics b 
       WHERE a.table_name = b.table_name 
       AND b.stattype_locked IS NULL); 
+0

感謝它的工作。唯一的一點是採取更多的時間,即15-20分鐘 – Rax

+0

選擇a.table_name 從dba_tab_statistics一個,DBA_TABLES b 其中a.owner像「SCHEMA1」 和a.table_name不喜歡「%TMP」 和a.table_name不 ('TABLE1','TABLE2','TABLE3') and a.stattype_locked IS NULL and b.temporary ='N' group by a.table_name order by max(a.NUM_ROWS)desc; – Rax