@ttt1

Как сравнивать две произвольные таблицы?

Добрый день!
Есть две таблицы. Известно, что большая часть данных в них пересекается. Но могут быть и совсем разные данные или измененные данные в одной из таблиц. Необходимо написать алгоритм по которому бы программа находила общие записи в таблицах и отображала. Как бы для начала подойти к этой задаче?
  • Вопрос задан
  • 14786 просмотров
Пригласить эксперта
Ответы на вопрос 4
oleg_agapov
@oleg_agapov
Data analyst, Business Intelligence
Всё-таки Java или SQL? :)
Если таки SQL. Подразумеваю, что используется Оракл.
Во-первых, если таблицы не большие, то не должно быть проблем с обычным джойном или декартовым произведением
SELECT 
t1.*, t2.*
FROM 
table1 t1,
table2 t2
WHERE
t1.fields = t2.fields

Если таблицы большие, тут нужно быть аккуратнее, чтоб не пошел фулл скан таблиц и все не зависло к чертям. Убедитесь, что в таблице есть индексы. Вам повезло, если индексы совпадают с теми полями, по которым нужно сравнивать.
Далее, я бы "откусывал" небольшие куски одной из таблиц и джойнил бы другую либо как в первом примере, либо вложенным подзапросом в SELECT. Если не критично для быстродействия, понемногу добавлял бы бОльшие куски первоначальной таблицы. Опять же, если не тормозит - то ок. В противном случае - писал бы процедуру для разбиения на куски и последующего джойна.
Ответ написан
@dmitryKovalskiy
программист средней руки
Можно взять 2 таблицы и попробовать сделать INNER JOIN по полям, которые должны пересечься.
Ответ написан
Комментировать
@bizon2000
Java-программист
Сливаем две таблицы
SELECT * FROM tbl1
UNION ALL
SELECT * FROM tbl2

затем группируем по всем полям и выбираем те группы, которые содержат более одной записи
SELECT *
    FROM (SELECT * FROM tbl1
          UNION ALL
          SELECT * FROM tbl2
         )
    GROUP BY field1, field2, ...
    HAVING COUNT(*) > 1

Такой запрос не требует индексов и будет очень эффективен даже на очень больших таблицах
Разумеется, решение основано на предположении об уникальности записей в каждой из таблиц
Ответ написан
Комментировать
@Rustemmus
Выбрать столбцы и строки, которые пересекаются в двух таблицах можно таким образом:

SELECT column1, column2, column3, column4 FROM table1
intersect
SELECT column1, column2, column3, column4 FROM table2


intersect выводит только те строки, которые есть в обеих таблицах.
union выводит строки исключив повторяющиеся (distinct). Соответственно это тяжелая операция.
union all выводит строки обеих таблиц без обработки.
minus отнимает от строк верхнего запроса строки нижнего запроса. Выводит только те строки, которые есть в верхнем, и нет в нижнем запросе.

Для всех упомянутых операций необходимо условие, чтобы выводимые столбцы были одинаковые.
Если структура таблиц разная, только некоторые столбцы одинаковые а выводить нужно все столбцы, то нужно использовать Join. Пример join-а описал Oleg Agapov.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы