2012-05-03 2 views
0

Я использую базу данных ORACLE. EDIT:sql запрос для поиска отсутствующих таблиц из базы данных

Я хочу, чтобы в таблице не присутствовали только таблицы, а не все эти таблицы в базе данных.

Ex: В моей базе следующих таблицах представлены:

a 
b 
c 
d 
e 
r 
s 

Я даться список таблиц:

a 
b 
c 
v 
h 

из которых я хочу, чтобы выяснить, какие таблицы отсутствующего (нет) в моей базе данных.

so: a, b, c - это те таблицы, которые присутствуют в моей базе данных. Так что кроме этих таблиц мой ответ будет:

v and h 

Мой ответ не D, E, R, S

Как я могу написать запрос для этого, чтобы узнать?

+0

вы можете запросить ALL_TABLES вид в оракула – 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) – 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

ok, но я не получил 'WITH table_names AS (', с чего мне начать? – saroj

+0

вот и все, от C до закрывающего 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

ya, но этим я получу таблицы, которые присутствуют в списке, я хочу получить таблицы, которые отсутствуют этот список, любая идея, пожалуйста, – saroj

+0

i обновил мой answear – Maddy

+0

'by not 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 
    ); 
Смежные вопросы