2013-12-18 53 views
1

我正在研究將每個表暴露在視圖中的Oracle數據庫。出於清晰的原因,我已經使視圖名稱包含它正在展示的表的名稱。現在我想知道是否有任何視圖中不包含名稱的表,這意味着我忘了暴露他們的視圖。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

我不會依賴視圖的名稱,除非你有絕對的把握,所有的視圖名稱甲肝e預定義的形式,例如'TABLE1_VIEW'。而是檢查「ALL_VIEWS.TEXT」列是否包含某個表名。 –

+0

你說得對,我根本不是一個可靠的方法。我主要把這視爲一個挑戰,因爲我是Oracle的新手,而且我不會自動執行任何操作。 – ederbf

回答

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)); 
+0

這就是我一直在尋找的東西。我能夠通過最少的修改來使用您的代碼。 – ederbf

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 
+0

此方法不會返回系統中可能存在的其他視圖引用的表。但在類似的情況下,使用user_dependencies表可能會很有用。 Upvote爲此。 – ederbf

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 
相關問題