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

Dav*_*ill 87 sql oracle

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

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

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

Ton*_*ews 181

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

select owner, table_name from all_tab_columns where column_name = 'ID';
Run Code Online (Sandbox Code Playgroud)

要查找包含任意或全部4列的表:

select owner, table_name, column_name
from all_tab_columns
where column_name in ('ID', 'FNAME', 'LNAME', 'ADDRESS');
Run Code Online (Sandbox Code Playgroud)

要查找包含所有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;
Run Code Online (Sandbox Code Playgroud)

  • 您应该使用DBA_TAB_COLUMNS而不是ALL_TAB_COLUMNS来执行此搜索,以防您登录的用户无法访问某些表. (2认同)
  • 如果您不确定确切的名称,请添加`column_name` +`like`:`select all owner,table_name,column_name from all_tab_columns其中column_name类似'someField%';` (2认同)

Jos*_*ons 10

您想要的数据位于"cols"元数据表中:

SELECT * FROM COLS WHERE COLUMN_NAME = 'id'
Run Code Online (Sandbox Code Playgroud)

这个将为您提供包含所需列的所有列的表的列表:

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%')  
Run Code Online (Sandbox Code Playgroud)

要在不同的模式中执行此操作,只需在表前指定模式,如

SELECT * FROM SCHEMA1.COLS WHERE COLUMN_NAME LIKE '%ID%';
Run Code Online (Sandbox Code Playgroud)

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

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%'
Run Code Online (Sandbox Code Playgroud)


小智 10

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

select owner,table_name from all_tab_columns where upper(column_name) =upper('keyword');
Run Code Online (Sandbox Code Playgroud)

如果您不知道下面的准确列使用,请搜索列名称:

select owner,table_name from all_tab_columns where upper(column_name) like upper('%keyword%');
Run Code Online (Sandbox Code Playgroud)