在视图中查找每列的源表

时间:2016-02-17 14:01:22

标签: sql oracle metadata database-administration

我尝试编写一个查询,在视图中提取表并将该视图中的每一列映射到相应的表。 我所能做的只是获取表名,我面对解析ddl的选项,或者创建一个表来记录元数据,但两者对于手头的任务都是非常昂贵的。 我也尝试使用DBMS-METADATA,但由于我对DBA不熟悉,我找不到让它正常工作的方法。有什么方法可以找到列的来源吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

如果是一对一映射,并且表格/视图中所有列的名称由" main"视图是唯一的(所有引用的表和视图都不能有任何具有相同名称的列),然后您可以查询USER_DEPENDENCIES和USER_TAB_COLUMNS,查看演示:

CREATE TABLE A( a int, b int, c int );

CREATE TABLE x( x int, y int, z int );

CREATE VIEW ax as 
select a as aa, b as bb, x as xx, y as yy
from a join x on a = x
;

CREATE VIEW my_view as
select a.a, x.z, ax.*
from a
cross join x
cross join ax
;

select c1.column_name, ' comes from ' as "Comes from", d.referenced_name 
from  user_dependencies d
join user_tab_columns cc ON cc.table_name = d.referenced_name
join user_tab_columns c1 ON c1.table_name = d.name AND c1.column_name = cc.column_name
where d.name = 'MY_VIEW';

COLUMN_NAME Comes from   REFERENCED_NAME   
----------- ------------ ---------------
A           comes from   A          
Z           comes from   X          
YY          comes from   AX         
XX          comes from   AX         
BB          comes from   AX         
AA          comes from   AX  

但是如果任何两个表(或视图)具有相同名称的列,则此查询会给出错误的结果 - 在这种情况下,唯一的选择是解析视图定义。