代码之家  ›  专栏  ›  技术社区  ›  David Oneill

在Oracle数据库中搜索具有特定列名的表?

  •  84
  • David Oneill  · 技术社区  · 16 年前

    我们有一个大型的Oracle数据库,有许多表。是否有一种方法可以查询或搜索以查找是否存在具有特定列名的表?

    IE显示所有具有列的表: id, fname, lname, address

    我忘记添加的细节:我需要能够搜索不同的模式。我必须用来连接的那个不拥有我需要搜索的表。

    4 回复  |  直到 10 年前
        1
  •  171
  •   Tony Andrews    10 年前

    要查找具有特定列的所有表:

    select owner, table_name from all_tab_columns where column_name = 'ID';
    

    要查找包含4列中任何一列或全部列的表,请执行以下操作:

    select owner, table_name, column_name
    from all_tab_columns
    where column_name in ('ID', 'FNAME', 'LNAME', 'ADDRESS');
    

    要查找全部有4列的表(不缺少一列),请执行以下操作:

    select owner, table_name
    from all_tab_columns
    where column_name in ('ID', 'FNAME', 'LNAME', 'ADDRESS')
    group by owner, table_name
    having count(*) = 4;
    
        2
  •  10
  •   kleopatra Aji kattacherry    12 年前

    要搜索列名,如果您准确知道列名,请使用以下查询:

    select owner,table_name from all_tab_columns where upper(column_name) =upper('keyword');
    

    若要在不知道准确列的情况下搜索列名称,请使用以下命令:

    select owner,table_name from all_tab_columns where upper(column_name) like upper('%keyword%');
    
        3
  •  9
  •   JosephStyons    16 年前

    您需要的数据在“cols”元数据表中:

    SELECT * FROM COLS WHERE COLUMN_NAME = 'id'
    

    这个会给你一张有 全部的 所需列:

    select distinct
      C1.TABLE_NAME
    from
      cols c1
      inner join
      cols c2
      on C1.TABLE_NAME = C2.TABLE_NAME
      inner join
      cols c3
      on C2.TABLE_NAME = C3.TABLE_NAME
      inner join
      cols c4
      on C3.TABLE_NAME = C4.TABLE_NAME  
      inner join
      tab t
      on T.TNAME = C1.TABLE_NAME
    where T.TABTYPE = 'TABLE' --could be 'VIEW' if you wanted
      and upper(C1.COLUMN_NAME) like upper('%id%')
      and upper(C2.COLUMN_NAME) like upper('%fname%')
      and upper(C3.COLUMN_NAME) like upper('%lname%')
      and upper(C4.COLUMN_NAME) like upper('%address%')  
    

    要在其他模式中执行此操作,只需在表前面指定模式,如中所示。

    SELECT * FROM SCHEMA1.COLS WHERE COLUMN_NAME LIKE '%ID%';
    

    如果要将多个模式的搜索组合到一个输出结果中,则可以执行以下操作:

    SELECT DISTINCT
      'SCHEMA1' AS SCHEMA_NAME
     ,TABLE_NAME
    FROM SCHEMA1.COLS
    WHERE COLUMN_NAME LIKE '%ID%'
    UNION
    SELECT DISTINCT
      'SCHEMA2' AS SCHEMA_NAME
     ,TABLE_NAME
    FROM SCHEMA2.COLS
    WHERE COLUMN_NAME LIKE '%ID%'
    
        4
  •  0
  •   Doug Porter    16 年前

    下面是一个我们保存到findcol.sql的文件,这样我们就可以从sqlplus中轻松地运行它。

    set verify off
    clear break
    accept colnam prompt 'Enter Column Name (or part of): '
    set wrap off
    select distinct table_name, 
                    column_name, 
                    data_type || ' (' || 
                    decode(data_type,'LONG',null,'LONG RAW',null,
                           'BLOB',null,'CLOB',null,'NUMBER',
                           decode(data_precision,null,to_char(data_length),
                                  data_precision||','||data_scale
                                 ), data_length
                          ) || ')' data_type
      from all_tab_columns
     where column_name like ('%' || upper('&colnam') || '%');
    set verify on