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


94

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

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

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

Answers:


198

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

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
如果您要登录的用户无权访问某些表,则可能应该使用DBA_TAB_COLUMNS而不是ALL_TAB_COLUMNS进行此搜索。
杰弗里·肯普

是的,但仅当您所连接的用户具有SELECT ANY TABLE特权时。
托尼·安德鲁斯

2
如果不确定确切的名称,请添加column_name+ likeselect owner, table_name, column_name from all_tab_columns where column_name like 'someField%';
Mike R

10

所需的数据在“ 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%'

如何使用它查看不同的架构?(我忘了在原始问题中提到该要求了)
David Oneill

只需将模式名称放在每个表名称的前面...即myschema.c1。显然,您必须对另一个方案具有选择特权
wadesworld

SELECT * FROM COLS从我的架构中不返回任何内容。我在表上只有选择特权。选择的内容不足以允许我通过COLS进行查看吗?
大卫·

select * from schema1.cols给我一个table or view does not exist错误。这与特权的设置有关吗?
大卫·奥尼尔

是的,会的。似乎托尼·安德鲁(Tony Andrew)的答案可能更适合您的情况。我忘记了“ all_tab_columns”视图。
JosephStyons

10

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

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%');

0

这是我们保存到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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.