MySQL сравнивает две таблицы и возвращает строки, которые имеют одинаковый первичный ключ, но разные данные в других полях - PullRequest
7 голосов
/ 24 февраля 2012

У меня есть две структурно идентичные таблицы, table2 является подготовительной площадкой для новых данных, которые будут использоваться при массовом обновлении table1.

Мне нужно выяснить, какие строки будут обновлены в таблице1. Я хочу игнорировать те строки, которые будут вставлены и те, которые будут удалены. Меня просто интересуют обновленные строки, в которых первичный ключ остается прежним, но одно или несколько других полей в строке содержат разные данные.

На данный момент наиболее близким является следующее утверждение.

SELECT table2.* FROM table2
INNER JOIN table1
ON table1.primarykey = table2.primarykey
WHERE table1.field1 != table2.field1
OR table1.field2 != table2.field2
OR table1.field3 != table2.field3

Возвращает 0 строк.

РЕДАКТИРОВАТЬ: запрос на самом деле работает. Возникла проблема с самими данными. Я собираюсь немного поболтать лицом.

Спасибо всем за ваш вклад.

Ответы [ 2 ]

4 голосов
/ 24 февраля 2012

Одна вещь, которую вы не учитываете - это null. Это может или не может быть вашей проблемой, поскольку это зависит от данных

SELECT table2.* FROM table2
INNER JOIN table1
ON table1.primarykey = table2.primarykey
WHERE table1.field1 != table2.field1
      OR table1.field2 != table2.field2
      OR table1.field3 != table2.field3
      OR (table1.field1 is null and table2.field1  is not null)
      OR (table2.field1 is null and table1.field1  is not null)
      OR (table1.field2 is null and table2.field2  is not null)
      OR (table2.field2 is null and table1.field2  is not null)
      OR (table1.field3 is null and table2.field3  is not null)
      OR (table2.field3 is null and table1.field3  is not null)
0 голосов
/ 24 февраля 2012

Другими словами, вы хотите посчитать в таблице2, сколько строк имеют первичный ключ, такой же, как в таблице1, и хотя бы одно из полей отличается, верно? Но как это важно, если данные разные или нет? Если данные совпадают, ОБНОВЛЕНИЕ не будет иметь никакого эффекта.

SELECT
   COUNT(T2.*) 
FROM
   table2 AS T2
JOIN table1 AS T1 ON (T1.primarykey = T2.primarykey);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...