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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сравнение таблиц

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
likvidator
Отправлено: 26 Января, 2017 - 21:04:21
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


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



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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


-----
PostgreSQL DBA
 
 Top
likvidator
Отправлено: 26 Января, 2017 - 22:24:01
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


Мелкий пишет:
Т.е. строки, для которых НЕТ парной в другой таблице?

Именно, а для mysql можно пример?
 
 Top
Мелкий Супермодератор
Отправлено: 26 Января, 2017 - 23:43:05
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




А глупый 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


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB