





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))
Еще одна причина избегать нулей при любой возможности.