oracle diff: как сравнить две таблицы? - PullRequest
27 голосов
/ 27 марта 2009

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

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

Ответы [ 12 ]

50 голосов
/ 29 июля 2010

Попробуйте это:

(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.

13 голосов
/ 27 марта 2009

Вы можете попробовать использовать операции набора: MINUS и INTERSECT

Смотрите здесь для более подробной информации: http://oreilly.com/catalog/mastorasql/chapter/ch07.html

5 голосов
/ 27 марта 2009

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

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

2 голосов
/ 16 января 2013

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

SELECT * FROM TABLE1
MINUS
SELECT * FROM TABLE2

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

2 голосов
/ 24 сентября 2010

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

alt text

2 голосов
/ 27 марта 2009

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

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

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

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

1 голос
/ 07 апреля 2009

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

0 голосов
/ 30 мая 2019

Попробуйте,

изменить набор сеансов "_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); 

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

0 голосов
/ 01 мая 2019

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

0 голосов
/ 21 июня 2018

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

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

descr TABLE_NAME1
descr TABLE_NAME2

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

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

  1. Выберите "Инструменты"
  2. Выберите «Различия в базе данных»
  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;
...