我正在研究一个在视图中公开每个表的Oracle数据库。为清晰起见,我已经使视图名称包含它正在公开的表的名称。现在我想知道是否有任何视图中没有包含其名称的表,这意味着我忘了让它们暴露出来。
如果我查询all_tables和all_views,我们假设得到以下结果:
SELECT table_name FROM all_tables:
TABLE1
TABLE2
TABLE3
SELECT view_name FROM all_tables:
TABLE1_VIEW
TABLE2_VIEW
我现在想查询两个结果并获取任何视图名称中包含的所有表名称和不包含的名称。在我的示例中,包括TABLE1和TABLE2,但TABLE3不包括。
我已经尝试循环所有表名并在视图名称结果集中查找它们中的每一个。我想知道是否有更直接的方法。
答案 0 :(得分:2)
现在我想知道是否有名称未包含在任何视图中的表
要查找此类表,我们可以通过查询[dba|all|user]_tables
数据字典视图和minus
那些已经视图的一部分的表名来获取我们感兴趣的所有表名通过查询[dba | all | user ]_dependencies
数据字典视图:
/* A couple of test tables */
SQL> create table t1(
2 col number
3 )
4 ;
Table created
SQL> create table t2(
2 col number
3 )
4 ;
Table created
/* a view */
SQL> create or replace view v_1 as
2 select *
3 from t1;
以下是当前架构中任何视图中未包含的表。
在此示例中,已使用user_ *数据字典视图,但您是免费的
使用dba_*
或all_*
或user_*
数据字典视图。
SQL> column table_name format a10
SQL> select q.table_name
2 from user_tables q
3 minus
4 select t.referenced_name
5 from user_dependencies t
6 where type = 'VIEW'
7 and t.referenced_type = 'TABLE'
8 ;
结果:
TABLE_NAME
----------
T2
答案 1 :(得分:1)
好的,我不确定这个解决方案会有多干净,但这至少是一种快速修复的方法。
假设您通过在表名末尾附加一个字符串(未改变)来创建视图
这将为您提供基于视图存在的所有表格
SELECT table_name
FROM user_tables a
WHERE EXISTS (SELECT 1
FROM user_views b
WHERE REGEXP_LIKE(b.view_name, a.table_name));
要获取没有视图的表,只需使用MINUS
SELECT table_name
FROM user_tables
MINUS
SELECT table_name
FROM user_tables a
WHERE EXISTS (SELECT 1
FROM user_views b
WHERE REGEXP_LIKE(b.view_name, a.table_name));
答案 2 :(得分:0)
如果我做得对:
视图中包含的表格:
SELECT table_name FROM user_tables T
LEFT JOIN USER_VIEWS V
ON T.table_name||'_VIEW'=V.view_name
WHERE V.View_name IS NULL
视图中不包含表格:
SELECT table_name FROM user_tables as T
JOIN USER_VIEWS as V
ON T.table_name||'_VIEW'=V.view_name