Как рассчитать разницу между таблицами в MySQL?

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

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
0
5 634
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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);
Ответ принят как подходящий

Вы также можете использовать левое внешнее соединение (первое говорит вам, где находится строка в таблице 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

Ни один из ответов, опубликованных до сих пор (от 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 представляет ее новую личность. Или это может быть грубая ошибка; база данных не должна хранить обе эти записи. Или может быть другое решение.

К сожалению, запросы от BrynJ и Vadim оба указали, что нет никакой разницы между A и B, что для меня сомнительно.

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

Нет нулей:

(A.Name = B.Name)

С нулями:

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

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

Другие вопросы по теме