Подтвердить что ты не робот

Oracle diff: как сравнить две таблицы?

Предположим, что у меня есть две таблицы: t1 и t2, которые идентичны в макете, но могут содержать разные данные.

Каков наилучший способ разграничения этих двух таблиц?

4b9b3361

Ответ 1

Попробуйте следующее:

(select * from T1 minus select * from T2) -- all rows that are in T1 but not in T2
union all
(select * from T2 minus select * from T1)  -- all rows that are in T2 but not in T1
;

Нет внешнего инструмента. Нет проблем с производительностью с union all.

Ответ 3

Вы можете использовать такой инструмент, как AQT, для создания различий между таблицами.

Другим подходом было бы выгрузить таблицы в текстовый файл и использовать инструмент сравнения, такой как WinMerge. При таком подходе вы можете использовать сложный SQL, чтобы сначала превратить таблицы в один и тот же макет.

Ответ 4

По этому вопросу я думаю, что вам нужно быть очень конкретным в отношении того, что вы ищете, поскольку существует множество способов его интерпретации и множества разных подходов. Некоторые подходы будут слишком большими, если ваш вопрос не оправдает этого.

На самом простом уровне есть "Являются ли данные таблицы точно такими же или нет?", на которые вы можете попытаться ответить простым сравнением счетчиков, прежде чем перейти к чему-то более сложному.

На другом конце шкалы есть "показать мне строки из каждой таблицы, для которых нет эквивалентной строки в другой таблице" или "показать мне, где строки имеют один и тот же ключ идентификации, но разные значения данных".

Если вы действительно хотите синхронизировать таблицу A с таблицей B, это может быть относительно простым, используя команду MERGE.

Ответ 5

Быстрое решение:

SELECT * FROM TABLE1
MINUS
SELECT * FROM TABLE2

Никакие записи не должны отображаться...

Ответ 6

Если у вас есть деньги, потратив, используйте инструмент PowerDIFF для Oracle: http://www.orbit-db.com. Он поставляется с несколькими вариантами сравнения и отлично справляется с этими типами заданий.

Ответ 7

Вы можете попробовать dbForge Data Compare for Oracle , бесплатный графический интерфейс для сравнения и синхронизации данных, который может выполнять эти действия по всей базе данных или частично.

alt text

Ответ 8

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

Первое. Если вы используете Oracle SQL Developer, вы можете запустить описание обеих таблиц, чтобы сравнить их:

descr TABLE_NAME1
descr TABLE_NAME2

Второе. Первое решение может не подойти для больших таблиц с большим количеством столбцов. Если вы хотите видеть только различия в данных между двумя таблицами, то, как уже упоминалось несколькими другими, следует использовать оператор SQL Minus.

Третье. Если вы используете Oracle SQL Developer и хотите сравнить структуру таблиц двух таблиц, используя разные схемы, вы можете сделать следующее:

  1. Выберите "Инструменты"
  2. Выберите "База данных Diff"
  3. Выберите "Подключение к источнику"
  4. Выберите "Соединение-получатель"
  5. Выберите "Стандартные типы объектов", которые вы хотите сравнить
  6. Введите "Имя таблицы"
  7. Нажимайте "Далее", пока не дойдете до "Готово"
  8. Нажмите "Готово"
  9. ПРИМЕЧАНИЕ. В шагах 3 и 4 вы должны выбрать различные схемы, в которых существуют объекты, которые вы хотите сравнить.

В-четвертых, если таблицы двух таблиц, которые вы хотите сравнить, имеют больше столбцов, находятся в одной и той же схеме, нет необходимости сравнивать более двух таблиц и непривлекательны для визуального сравнения с помощью команды DESCR, вы можете использовать следующее для сравнения различий в структура таблицы:

select 
     a.column_name    || ' | ' || b.column_name, 
     a.data_type      || ' | ' || b.data_type, 
     a.data_length    || ' | ' || b.data_length, 
     a.data_scale     || ' | ' || b.data_scale, 
     a.data_precision || ' | ' || b.data_precision
from 
     user_tab_columns a,
     user_tab_columns b
where 
     a.table_name = 'TABLE_NAME1' 
and  b.table_name = 'TABLE_NAME2'
and  ( 
       a.data_type      <> b.data_type     or 
       a.data_length    <> b.data_length   or 
       a.data_scale     <> b.data_scale    or 
       a.data_precision <> b.data_precision
     )
and a.column_name = b.column_name;

Ответ 9

select * from table1 where table1.col1 in (select table2.col1 from table2)

Предполагая, что col1 является столбцом первичного ключа, и это даст все строки в table1, соответствующие столбцу table2.

select * from table1 where table1.col1 not in (select table2.col1 from table2)

Надеюсь, что это поможет

Ответ 10

Try:

select distinct T1.id
  from TABLE1 T1
 where not exists (select distinct T2.id
                     from TABLE2 T2
                    where T2.id = T1.id)

С sql oracle 11g +

Ответ 11

Я использовал Oracle SQL developer для экспорта таблиц в формат CSV, а затем провел сравнение с помощью WinMerge.

Ответ 12

Попробуй это,

изменить набор сеансов "_convert_set_to_join" = true;

Другая альтернатива - переписать SQL-запрос вручную [замена оператора минус на подзапрос NOT IN] свидетельствует об улучшении времени выполнения примерно на 30%.

 select * 
   from A 
    where (col1,col2,?) not in 
   (select col1,col2,? from B) 
   union all 
   select * from B 
  where (col1,col2,?) not in 
  (select col1,col2,? from A); 

Я ссылался на этот пост, нажмите здесь