Найти столбцы, представленные в одной таблице, а не в другой. Пожалуйста, прочтите описание - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть две версии базы данных V5 и V9. V9 является последней версией. Я должен найти столбцы с похожим именем таблицы, которые присутствуют в таблице V9, а не в V5. Например, имя таблицы: ashish_table в V9 имеет 5 столбцов A, B, C, D и E. та же таблица ashish_table в V5 имеет 3 столбца A, B и C.

Таким образом, в таблице ashish_table таблицы V9 есть две колонки D и E, а в таблице ashish_table таблицы V5 нет.

Я установил связи между этими двумя базами данных. Я также искал и нашел ниже скрипт, который сравнивает таблицы на основе «data_type, data_length, data_scale, data_precision», но он сопоставляет только столбцы с одинаковыми именами. например. он будет соответствовать столбцам A, B и C на основе data_type, data_length, data_scale, data_precision; если предположить, что тип данных столбца A был изменен с char на varchar и остальные два столбца совпадают, то он вернет только столбец A. Он не дает D и E, которых нет в ashish_table V5.

set verify  off 
set heading off
column data_type format a20

accept table1 prompt 'Table 1: '
accept table2 prompt 'Table 2: '

prompt
prompt The table &table1 and &table2 have columns with the same name but differ:
prompt -------------------------------------------------------------------------

select 
       column_name,data_type, data_length, data_scale, data_precision
from  
       user_tab_columns
where 
       table_name = upper('&table1')
minus
select 
       column_name,data_type, data_length, data_scale, data_precision
from 
       user_tab_columns
where 
       table_name = upper('&table2');

Спасибо, что прочитали большой вопрос. Есть ли скрипт, который сравнивает две таблицы и дает пропущенные столбцы.

1 Ответ

0 голосов
/ 23 апреля 2019

Вы можете использовать следующее, чтобы найти дополнительные столбцы:

select c2.table_name,c2.COLUMN_NAME
from all_tab_cols c2
where table_name='&table1'
and c2.COLUMN_NAME not in (select column_name 
    from all_tab_cols 
    where table_name='&table2');

Это не проверено, но может сделать это:

select 
       column_name,data_type, data_length, data_scale, data_precision
from  
       user_tab_columns
where 
       table_name = upper('&table1')
minus
select 
       column_name,data_type, data_length, data_scale, data_precision
from 
       user_tab_columns
where 
       table_name = upper('&table2');
union
select c2.COLUMN_NAME, c2.data_type, c2.data_length, c2.data_scale, c2.data_precision
from all_tab_cols c2
where table_name='&table1'
and c2.COLUMN_NAME not in (select column_name 
    from all_tab_cols 
    where table_name='&table2');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...