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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (35)

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

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

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

提问于
用户回答回答于

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

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;
用户回答回答于

你需要的数据位于“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%'

扫码关注云+社区