我需要显示所有没有记录的表。
我试过了,
select * from user_all_tables where (select count(*) from user_all_tables)=0;
但它似乎不起作用。 我该如何重新设计此查询? 感谢。
答案 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;