Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Сравнение таблиц
Форумы портала PHP.SU » » Вопросы новичков » Сравнение таблиц

Страниц (1): [1]
 

1. likvidator - 26 Января, 2017 - 21:04:21 - перейти к сообщению
Есть 2 абсолютно одинаковые таблицы по структуре (id, key1, key2, key3..), но с разными данными. Необходимо найти уникальные записи в двух таблицах. Уникальных ключей нет, т. Е. id записи из первой таблицы во второй может принадлежать другой записи из второй. Сравнение идёт по столбцам key1, key2, key3... Грубо говоря нужно достать записи где table1.key1 != table2. key1 AND table1.key2 != table2. key2, и т. д. Не могу найти оптимальный вариант, подскажите.
2. Мелкий - 26 Января, 2017 - 21:34:42 - перейти к сообщению
likvidator пишет:
нужно достать записи где table1.key1 != table2. key1 AND table1.key2 != table2. key2

Согласно базовой булевой логике этому условию будут подходить чуть менее чем всё декартово произведение таблиц.

likvidator пишет:
Необходимо найти уникальные записи в двух таблицах.

Т.е. строки, для которых НЕТ парной в другой таблице?
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM table1 FULL OUTER JOIN table2 USING(key1, key2, key3) WHERE table1.id IS NULL OR table2.id IS NULL
3. likvidator - 26 Января, 2017 - 22:24:01 - перейти к сообщению
Мелкий пишет:
Т.е. строки, для которых НЕТ парной в другой таблице?

Именно, а для mysql можно пример?
4. Мелкий - 26 Января, 2017 - 23:43:05 - перейти к сообщению
А глупый mysql умеет только nested loops, поэтому full join там не сделать.
Классический workaround - поизвращаться с объединением пары left join.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT 'table1' AS t, id, key1, key2, key3
  2. FROM table1 LEFT JOIN table2 USING(key1, key2, key3)
  3. WHERE table2.id IS NULL
  4. UNION ALL
  5. SELECT 'table2' AS t, id, key1, key2, key3
  6. FROM table2 LEFT JOIN table1 USING(key1, key2, key3)
  7. WHERE table1.id IS NULL

 

Powered by ExBB FM 1.0 RC1