2012-05-03 67 views
0

我正在使用ORACLE數據庫。 編輯從數據庫中查找缺席表的sql查詢

我想在列表中不存在唯一的表,而不是所有的數據庫這些表。

例:在我的數據庫下表是存在的:

a 
b 
c 
d 
e 
r 
s 

我被賦予表的列表:

a 
b 
c 
v 
h 

外面我想找出哪些表缺席(不存在)在我的數據庫中。

所以:a,b,c是存在於我的數據庫中的那些表。因此,排除這些表我的回答將是:

v and h 

我的答案是沒有D,E,R,S

我怎麼能寫這樣的查詢,找出?

+0

你可以在Oracle – Maddy

回答

2

您可以使用

SELECT a.table_name FROM (SELECT 'A' as table_name 
       FROM DUAL UNION 
       SELECT 'B' as table_name 
       FROM DUAL UNION 
       SELECT 'C' as table_name 
       FROM DUAL UNION 
       SELECT 'V' as table_name 
       FROM DUAL UNION 
       SELECT 'H' as table_name 
       FROM DUAL) a WHERE NOT EXISTS (
SELECT 1 FROM DBA_TABLES b where b.table_name=a.table_name) 
+0

我怎麼給我的名單有(到位your_list的)查詢ALL_TABLES視圖 – Maddy

+0

CREATE TABLE YOUR_LIST(TABLE_NAME VARCHAR2(100)); – psaraj12

+0

現在我們沒有桌子了,我們有一個包含表格名稱的列表 – Maddy

1
WITH table_names AS ( 
    SELECT 'A' AS tname FROM DUAL 
    UNION ALL 
    SELECT 'B' FROM DUAL 
    UNION ALL 
    SELECT 'C' FROM DUAL 
    UNION ALL 
    SELECT 'D' FROM DUAL 
    UNION ALL 
    SELECT 'E' FROM DUAL 
) 
SELECT tn.tname 
FROM table_name tn 
WHERE NOT EXISTS (SELECT 1 
        FROM all_tables at 
        WHERE tn.tname = at.table_name); 

的WITH部分只是寫一個派生表(「內嵌視圖」)的不同(重複使用)的方式。

+0

好的,但我沒有得到'WITH table_names AS(',我應該從哪裏開始? – saroj

+0

這就是所有的,從WITH到結束的所有元素之前SELECT包含一個「CTE」,它是查詢的其餘部分可以引用的虛擬表。 –

+0

@saroj:它只是在那裏建立「上即時」的表。你也可以把它放到子選擇中。 –

0
SELECT table_name FROM DBA_tables WHERE table_name IN (Yourlist comes here) 

例如

SELECT table_name FROM DBA_tables WHERE table_name NOT IN ('a','b','c'); 
+0

亞,但這個我會得到這些表中存在的名單,我想表那些缺席這份名單中,任何想法請 – saroj

+0

我通過沒有更新我的answear – Maddy

+0

'in'我會得到所有的表那些沒有出現在列表中,我想,表從這個名單不存在,或許UR混亂,我已經更新了我的問題 – saroj

1

我會用減號來(以下摘要)做到這一點:

select table_name from table_list 
minus 
select table_name from db_tables 
; 

更充分:

with table_list as 
( select 'A' table_name from dual  
union select 'B' table_name from dual 
union select 'C' table_name from dual 
union select 'V' table_name from dual 
union select 'H' table_name from dual 
) 
, db_tables as 
( select 'A' table_name from dual 
union select 'B' table_name from dual 
union select 'C' table_name from dual 
union select 'D' table_name from dual 
union select 'E' table_name from dual 
union select 'R' table_name from dual 
union select 'S' table_name from dual 
) 
select table_name from table_list 
minus 
select table_name from db_tables 
; 
0

您可以使用該表和sys.dbms_debug_vc2coll創建一個virtua l列表中的列。

下應該做的伎倆:

SELECT 
    column_value AS missing_table_names 
FROM 
    TABLE(SYS.DBMS_DEBUG_VC2COLL('a','b','c','v','h')) 
WHERE 
    column_value NOT IN (
     SELECT 
      table_name 
     FROM 
      ALL_TABLES 
    );