从all_tab_columns中选择表,其中表具有> 0行

时间:2018-07-24 15:15:36

标签: sql oracle

我需要在大型数据库中搜索与列名匹配的表,但是该表必须具有0行以上。

以下是查询:

SELECT * FROM all_tab_columns WHERE column_name LIKE '%ID_SUPPORT%';

3 个答案:

答案 0 :(得分:0)

一种方法:

SELECT * FROM all_tables WHERE num_rows > 0
  AND table_name in (SELECT table_name FROM all_tab_columns WHERE column_name LIKE '%ID_SUPPORT%')

答案 1 :(得分:0)

如果定期分析您的数据库,直接的方法是使用以下SQL:

SELECT *
  FROM all_tables t 
 WHERE t.table_name LIKE '%ID_SUPPORT%'
   and t.num_rows > 0;

更精确的确定方法是使用以下方法:

declare
  v_val pls_integer := 0;
begin
  for c in (
            SELECT *
              FROM all_tables t
             WHERE t.table_name LIKE '%ID_SUPPORT%'
           ) 
  loop  

    execute immediate 'select count(1) from '||c.owner||'.'||c.table_name into v_val;

    if v_val > 0 then
     dbms_output.put_line('Table Name : '||c.table_name||' with '||v_val||' rows ');
    end if;

  end loop;  
end;

我对matches一词感到困惑。如果您的意思是column,而不是table,则可以使用以下例程获取所需的表,这些表的名称类似于ID_SUPPORT

declare
  v_val pls_integer := 0;
begin
  for c in (
            SELECT t.*
              FROM all_tab_columns c
              JOIN all_tables t on ( c.table_name = t.table_name )
             WHERE c.column_name LIKE '%ID_SUPPORT%'
           ) 
  loop  

    execute immediate 'select count(1) from '||c.owner||'.'||c.table_name into v_val;

    if v_val > 0 then
     dbms_output.put_line('Table Name : '||c.table_name||' with '||v_val||' rows ');
    end if;

  end loop;  
end;

答案 2 :(得分:0)

您可以使用单个查询来过滤名称并获得实际行数:

SELECT owner, table_name, cnt              
FROM all_tab_columns, XMLTABLE('/ROWSET/ROW' passing 
             (dbms_xmlgen.getxmltype(REPLACE(REPLACE(
             'select COUNT(*) AS cnt from <owner>.<table_name>', '<owner>', owner)
             , '<table_name>', table_name))) COLUMNS cnt INT)
WHERE column_name LIKE '%ID_SUPPORT%' AND cnt > 0;

DBFiddle Demo