选择没有记录的所有表

时间:2010-05-17 10:56:54

标签: sql oracle

我需要显示所有没有记录的表。

我试过了,

select * from user_all_tables where (select count(*) from user_all_tables)=0;

但它似乎不起作用。 我该如何重新设计此查询? 感谢。

5 个答案:

答案 0 :(得分:6)

如果分析了所有表格,您可以查看表格num_rows的{​​{1}}列。

否则,您将需要PL / SQL来完成这项工作。这将输出当前用户的所有表格而不显示记录(如果您需要其他用户的表格,请使用user_tables):

all_tables

答案 1 :(得分:3)

您必须求助于PL / SQL并为每个表发出一个选择计数(*)。或者您可以使用dbms_xmlgen以一种棘手的方式为您执行此操作:

select table_name
  from ( select table_name
              , extractvalue
                ( dbms_xmlgen.getxmltype('select count(*) c from '|| table_name)
                , '/ROWSET/ROW/C'
                ) cnt
              , rownum to_prevent_predicate_push
           from user_tables
       )
 where cnt = '0'

此致 罗布。

答案 2 :(得分:2)

接受答案的变化,但使用更有效的方法。

Declare
  cnt PLS_INTEGER;
Begin
  For c In ( Select table_name From user_tables ) Loop
    begin
       Execute Immediate 'Select 1 From dual where exists (select 1 from ' || c.table_name ||')' Into cnt;
    exception when no_data_found then
      dbms_output.put_line( c.table_name );
    end;  
  End Loop;
End;

答案 3 :(得分:0)

select TABLE_NAME
from USER_ALL_TABLES
where NUM_ROWS = 0

答案 4 :(得分:0)

这个答案是每个表的一个Fetch比Rene的效率更高。 SELECT INTO需要Extra Fetch来查看是否应该引发“TOO_MANY_ROWS”异常。我们可以使用显式游标控制该进程,而不是进行不必要的额外提取。

Declare
  cnt PLS_INTEGER;
  s_Cur Varchar2(255);
  c_Cur Sys_refcursor;
Begin
   For c In ( Select table_name From user_tables ) Loop

      s_Cur := 'Select 1  From dual where exists (select 1 from ' || c.table_name ||')';    

      Open c_Cur For s_cur ;
      Fetch c_cur into cnt;        
      If c_cur%NOTFOUND then 
          dbms_output.put_line( c.table_name );
      end if;

   End Loop;
End;