Как рассчитать разницу между таблицами в MySQL? - PullRequest
2 голосов
/ 10 января 2009

Что является хорошим способом для вычисления разницы (в каком-то смысле, что нужно добавить и удалить из одной таблицы, чтобы получить другую) между таблицами в MySQL?

Ответы [ 3 ]

7 голосов
/ 11 января 2009

Ни один из ответов, опубликованных до сих пор (от BrynJ и Vadim), не делает очень тщательной работы. И делать основательную работу также невероятно сложно. Оба ответа предполагают, что достаточно знать, какие идентификационные номера присутствуют в каждой таблице. Однако, как правило, таблицы имеют более одного столбца.

Давайте назовем таблицы A и B.

Одним из важных вопросов является "имеют ли две таблицы одинаковую схему"? Если нет, то одна проблема заключается в том, какие столбцы нужно добавить в A, а какие - в B, чтобы сделать их схемы одинаковыми. Это запрос метаданных, отвечающий из системного каталога. Какие значения следует вставить в столбцы, добавленные в таблицы, представляет собой интересный вопрос.

Предположим, что таблицы на самом деле имеют одинаковую схему, включая одинаковый первичный ключ и одинаковые функциональные зависимости между столбцами. Также предположим, что есть столбец ID (с уникальным целым числом), столбец Name (строка) и столбец RefDate типа DATE.

Table A                                 Table B
ID  Name         RefDate                ID  Name         RefDate
1   Frederick    2007-01-23             1   Josephine    2009-01-10

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

Я думаю, что было бы справедливо сказать, что нет однозначного ответа на это, не зная намного больше контекста. Возможно, Фредерик перенес операцию по смене пола с 2007 года, и запись в B представляет ее новую личность. Или это может быть ошибка; база данных не должна хранить обе эти записи. Или может быть другое решение.

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

Кстати, обратите внимание, что сравнение строк, когда строки могут иметь значения NULL, является более сложным, чем когда их нет. Например, рассмотрим сравнение имен:

Нет значений:

(A.Name = B.Name)

С нулями:

(A.Name = B.Name OR (A.Name IS NULL AND B.Name IS NULL))

Еще одна причина избегать нулей, когда вы можете.

1 голос
/ 10 января 2009

Вы также можете использовать левое внешнее объединение (первое указывает, где находится строка в таблице a, а не b, второе наоборот):

SELECT a.id FROM a LEFT JOIN b ON a.id = b.id WHERE b.id IS NULL
SELECT b.id FROM b LEFT JOIN a ON b.id = a.id WHERE a.id IS NULL
1 голос
/ 10 января 2009
SELECT DISTINCT id FROM a WHERE NOT EXISTS (SELECT * FROM b WHERE a.id = b.id);
SELECT DISTINCT id FROM b WHERE NOT EXISTS (SELECT * FROM a WHERE a.id = b.id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...