sql - 查找 View 中每一列的源表

标签 sql oracle metadata database-administration

我正在尝试编写一个查询来提取 View 中的表并将该 View 中的每一列映射到相应的表。 我所能做的就是仅获取表名称,我面临着解析 ddl 或创建一个表来记录元数据的选项,但这对于手头的任务来说都是非常昂贵的。 我也尝试过使用 DBMS-METADATA,但我找不到办法让它正常工作,因为我对 DBA 有点陌生。有什么办法可以找到列的来源吗?提前致谢!

最佳答案

如果是一对一映射,并且“主” View 引用的表/ View 中所有列的名称都是唯一的(所有引用的表和 View 不能有同名的列),
然后就可以查询USER_DEPENDENCIES和USER_TAB_COLUMNS,看demo:

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  

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

关于sql - 查找 View 中每一列的源表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35458778/

相关文章:

sql - Oracle - 仅返回最早日期当前或将来的日期

sql - 我如何将 Case 语句的 Null 值返回到 Group by

oracle - 我的程序中不断出现错误,这些错误有助于添加新类(class),并在说明中提出了要求

xsd - 将元数据添加到 XSD 定义

c++ - TagLib: 无法打开文件

sql - 仅使用 where 条件删除重复项

Mysql 选择上个月的总和(价格)

Oracle 唯一约束和主键不为空

使用 ORCH 从 R 中读取配置单元表

windows - Git for Windows - 防止 .pack 文件日期/时间修改