【问题标题】:Search an Oracle database for tables with specific column names?在 Oracle 数据库中搜索具有特定列名的表?
【发布时间】:2010-12-29 12:32:07
【问题描述】:

我们有一个包含许多表的大型 Oracle 数据库。有没有办法可以查询或搜索以查找是否存在具有某些列名的表?

IE 显示所有包含这些列的表:id, fname, lname, address

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

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 您可能应该使用 DBA_TAB_COLUMNS 而不是 ALL_TAB_COLUMNS 来执行此搜索,以防您登录的用户无权访问某些表。
    • 正确,但前提是您连接的用户具有 SELECT ANY TABLE 权限。
    • 如果您不确定确切的名称,请添加column_name + likeselect owner, table_name, column_name from all_tab_columns where column_name like 'someField%';
    【解决方案2】:

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

    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】:

    这是我们保存到 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
    

    【讨论】:

      【解决方案4】:

      你想要的数据在“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%'
      

      【讨论】:

      • 如何使用它来查看不同的架构? (我忘了在我原来的问题中提到那个要求)
      • 只需将模式名称添加到每个表名的前面...即myschema.c1.显然,您必须在其他方案上具有选择权限
      • SELECT * FROM COLS 从我的架构中返回任何内容。我只有对表的选择权限。选择是否不足以让我通过 COLS 查看它?
      • select * from schema1.cols 给了我一个table or view does not exist 错误。这与权限的设置方式有关吗?
      • 是的,会的。似乎托尼安德鲁的回答可能更适合您的情况。我忘记了“all_tab_columns”视图。
      猜你喜欢
      • 1970-01-01
      • 2018-03-17
      • 2022-06-10
      • 2017-04-23
      • 2016-08-10
      • 2012-08-14
      • 2012-08-16
      • 2014-09-23
      相关资源
      最近更新 更多