Как выбрать разные строки в двух таблицах MySQL с одинаковой структурой? - PullRequest
2 голосов
/ 16 марта 2010

У меня есть две таблицы, A и B, которые имеют одинаковую структуру (около 30+ полей). Есть ли короткий, элегантный способ объединить эти таблицы и выбирать только те строки, в которых один или несколько столбцов отличаются? Я, конечно, мог бы написать сценарий, который создает запрос со всеми именами столбцов, но, возможно, есть решение только для SQL.

Другими словами: есть ли краткая замена этому:

SELECT *
FROM   table_a a
  JOIN table_b b ON a.pkey=b.pkey
WHERE  a.col1 != b.col2
    OR a.col2 != b.col2
    OR a.col3 != b.col3 # .. repeat for 30 columns

Ответы [ 3 ]

1 голос
/ 16 марта 2010

Существует стандартный способ SQL сделать это (ВЫБОР МИНУС), но MySQL (наряду со многими другими СУБД) не поддерживает его.

Если это не удастся, вы можете попробовать это:

SELECT a.* FROM a NATURAL LEFT JOIN b
    WHERE b.pkcol IS NULL

Согласно документации MySQL, NATURAL JOIN объединит две таблицы во всех столбцах с одинаковыми именами. Отфильтровывая записи a, в которых столбец первичного ключа b возвращается NULL, вы фактически получаете только записи a без соответствующей записи таблицы b.

К вашему сведению: это основано на документации MySQL, а не на личном опыте.

1 голос
/ 16 марта 2010

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

Также ваш запрос не будет включать записи в table_b, которые не имеют соответствующей записи в table_a. Поэтому в идеале вы должны использовать FULL JOIN.

Если вам нужно часто выполнять эту операцию, вы можете ввести какой-то дополнительный столбец данных, который обновляется всегда, когда что-либо в строке изменяется. Это может быть так же просто, как столбец TIMESTAMP, который обновляется с помощью триггеров UPDATE/INSERT. Затем, когда вы сравниваете, вы даже знаете, какая запись более свежая. Но опять же, это не пуленепробиваемое решение.

0 голосов
/ 16 марта 2010

Лучший способ, о котором я могу подумать, - это создать временную таблицу с такой же структурой, но с уникальным ограничением для 30 полей, которые вы хотите проверить. Затем вставьте все строки из таблицы A во временную таблицу, затем все строки из таблицы B во временную таблицу ... По мере ввода строк из B (используйте insert игнорировать) те, которые не являются уникальными хотя бы для одного столбца, быть сброшенным В результате у вас будут только строки, в которых как минимум 1 столбец отличается в вашей временной таблице. Затем вы можете выбрать все из этого.

...