找到视图中每列的来源 table
find the source table of each column in view
我正在尝试编写一个查询来提取视图中的 table,并将该视图中的每一列映射到相应的 table。
我所能做的就是只获取 table 名称,我面临的选择是解析 ddl 或者创建一个 table 来记录元数据,但这两者对于任务来说都是非常昂贵的在眼前。
我也尝试过使用 DBMS-METADATA,但由于我是 DBA 的新手,所以找不到使它正常工作的方法。有什么办法可以找到列的来源吗?提前致谢!
如果是一对一映射,并且"main"视图引用的tables/views中的所有列的名称都是唯一的(所有引用的表和视图不能有相同的列) name),
然后你可以查询 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
但是,如果任何两个表(或视图)具有同名的列,则此查询会给出错误的结果——在这种情况下,唯一的选择是解析视图定义。
我正在尝试编写一个查询来提取视图中的 table,并将该视图中的每一列映射到相应的 table。 我所能做的就是只获取 table 名称,我面临的选择是解析 ddl 或者创建一个 table 来记录元数据,但这两者对于任务来说都是非常昂贵的在眼前。 我也尝试过使用 DBMS-METADATA,但由于我是 DBA 的新手,所以找不到使它正常工作的方法。有什么办法可以找到列的来源吗?提前致谢!
如果是一对一映射,并且"main"视图引用的tables/views中的所有列的名称都是唯一的(所有引用的表和视图不能有相同的列) name),
然后你可以查询 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
但是,如果任何两个表(或视图)具有同名的列,则此查询会给出错误的结果——在这种情况下,唯一的选择是解析视图定义。