Предположим, что у меня есть две таблицы: t1 и t2, которые идентичны в макете, но могут содержать разные данные.
Каков наилучший способ разграничения этих двух таблиц?
Предположим, что у меня есть две таблицы: t1 и t2, которые идентичны в макете, но могут содержать разные данные.
Каков наилучший способ разграничения этих двух таблиц?
Попробуйте следующее:
(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
.
Вы можете попробовать использовать операции набора: MINUS
и INTERSECT
Смотрите здесь для более подробной информации:
О'Рейли - Освоение Oracle SQL - Глава 7 - Операции над множествами
Вы можете использовать такой инструмент, как AQT, для создания различий между таблицами.
Другим подходом было бы выгрузить таблицы в текстовый файл и использовать инструмент сравнения, такой как WinMerge. При таком подходе вы можете использовать сложный SQL, чтобы сначала превратить таблицы в один и тот же макет.
По этому вопросу я думаю, что вам нужно быть очень конкретным в отношении того, что вы ищете, поскольку существует множество способов его интерпретации и множества разных подходов. Некоторые подходы будут слишком большими, если ваш вопрос не оправдает этого.
На самом простом уровне есть "Являются ли данные таблицы точно такими же или нет?", на которые вы можете попытаться ответить простым сравнением счетчиков, прежде чем перейти к чему-то более сложному.
На другом конце шкалы есть "показать мне строки из каждой таблицы, для которых нет эквивалентной строки в другой таблице" или "показать мне, где строки имеют один и тот же ключ идентификации, но разные значения данных".
Если вы действительно хотите синхронизировать таблицу A с таблицей B, это может быть относительно простым, используя команду MERGE.
Быстрое решение:
SELECT * FROM TABLE1
MINUS
SELECT * FROM TABLE2
Никакие записи не должны отображаться...
Если у вас есть деньги, потратив, используйте инструмент PowerDIFF для Oracle: http://www.orbit-db.com. Он поставляется с несколькими вариантами сравнения и отлично справляется с этими типами заданий.
Вы можете попробовать dbForge Data Compare for Oracle , бесплатный графический интерфейс для сравнения и синхронизации данных, который может выполнять эти действия по всей базе данных или частично.
В дополнение к некоторым другим предоставленным ответам, если вы хотите посмотреть на различия в структуре таблицы с таблицей, которая может иметь похожую, но отличающуюся структуру, вы можете сделать это несколькими способами:
Первое. Если вы используете Oracle SQL Developer, вы можете запустить описание обеих таблиц, чтобы сравнить их:
descr TABLE_NAME1
descr TABLE_NAME2
Второе. Первое решение может не подойти для больших таблиц с большим количеством столбцов. Если вы хотите видеть только различия в данных между двумя таблицами, то, как уже упоминалось несколькими другими, следует использовать оператор SQL Minus.
Третье. Если вы используете Oracle SQL Developer и хотите сравнить структуру таблиц двух таблиц, используя разные схемы, вы можете сделать следующее:
В-четвертых, если таблицы двух таблиц, которые вы хотите сравнить, имеют больше столбцов, находятся в одной и той же схеме, нет необходимости сравнивать более двух таблиц и непривлекательны для визуального сравнения с помощью команды 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;
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)
Надеюсь, что это поможет
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 +
Я использовал Oracle SQL developer для экспорта таблиц в формат CSV, а затем провел сравнение с помощью WinMerge.
Попробуй это,
изменить набор сеансов "_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);
Я ссылался на этот пост, нажмите здесь