SQL-Ex blog
Недавно мы рассматривали сравнение схем с помощью Azure Data Studio. Что если нам потребуется сравнение таблиц с помощью запроса? В этой статье мы сравним использование EXCEPT, NOT IN, и NOT EXISTS для нахождения различий в двух таблицах.
Мы будем сравнивать две таблицы Comic и Comic_Copy. В Comic содержится на 48 строк больше, чем в Comic_Copy. Давайте найдем отличие.

EXCEPT
Давайте начнем сравнение с EXCEPT. При использовании EXCEPT мы захотим иметь одинаковое число и порядок столбцов, а также одинаковые типы данных. Мы удовлетворяем этим критериям в нашем примере, поэтому давайте выполним наш запрос и посмотрим на результаты:
SELECT Id,Title
FROM Comic
EXCEPT
SELECT Id,Title
FROM Comic_Copy;
GO

Мы видим 48 строк, что правдоподобно, исходя из подсчетов, которые мы рассматривали ранее.
NOT IN
Теперь мы будем использовать NOT IN для сравнения таблиц. Выберем Id из таблицы Comic, и будем использовать подзапрос, чтобы получить идентификаторы в Comic_Copy:
SELECT Id, Title
FROM Comic
WHERE Id NOT IN (
SELECT Id
FROM Comic_Copy
);
GO

Мы опять получаем наши 48 строк.
NOT EXISTS
Наконец, давайте проверим NOT EXISTS.
SELECT Id, Title
FROM Comic AS c
WHERE NOT EXISTS (
SELECT 1
FROM Comic_Copy AS cc
WHERE cc.Id = c.Id
);
GO

Что работает лучше?
Если мы выполним все три запроса вместе, какой покажет себя лучше остальных?

EXCEPT не кажется лучшим вариантом, в то время как два других варианта демонстрируют одинаковый план. Мы работаем с относительно небольшим набором данных, поэтому выполнение каждого запроса занимает менее секунды с одним и тем же числом логических чтений.
Хотя NOT IN и NOT EXISTS работают по-разному. Для NULL-значений NOT IN не вернет записей, поскольку NULL-значения не трактуются как сравниваемые. При использовании NOT EXISTS NULL также будут возвращаться.
Если мы изменим одно из значений title на NULL:
UPDATE Comic
SET Title = NULL
WHERE /> GO
и выполним запросы на сравнение по Title, то получим разные результаты. NOT IN даст нам 47 строк:

А NOT EXISTS по-прежнему дает 48:

Переходим на NOT EXISTS
Мы рассмотрели три разных метода нахождения различий между таблицами. Все три варианта с использованием EXCEPT, NOT IN и NOT EXISTS могут выполнить работу, но разными способами. NOT EXISTS был бы моим «выбором» для оптимального поиска различий, но имейте в виду наличие NULL при сравнении с помощью NOT IN.
Обратные ссылки
Нет обратных ссылок
Комментарии
Показывать комментарии Как список | Древовидной структурой
Автор не разрешил комментировать эту запись
Как сравнить две таблицы sql
Для работы с данными из нескольких таблиц можете попробовать следующие варианты.
Оператор JOIN используется для объединения двух таблиц по определенному условию, например, по ключевому полю. Следующий запрос объединяет две таблицы table1 и table2 по столбцу id и выбирает все строки, где значения в столбцах column1 и column2 совпадают:
Оператор EXCEPT используется для вычитания одной таблицы из другой. Следующий запрос выбирает все строки из таблицы table1 , которых нет в таблице table2 :
Еще есть оператор UNION для объединения строк из двух таблиц, но это не сравнение таблиц, а скорее склейка данных из них.
Сравнение двух таблиц по содержимому в SQL
Как сравнить две одинаковые по структуре но различающиеся по содержимому таблицы.

SELECT *
FROM base1 a
LEFT JOIN base2 b ON a.id = b.id

В этом примере вместо отсутствующих значений получим NULL.
Запрос с использованием функции EXCEPT
SELECT * FROM test1
SELECT * FROM test2
вернет тот же результат что и запрос
SELECT * FROM test2
WHERE id NOT IN (SELECT id FROM test1)

В данном случае будут отображены только те строки. которые не совпадают.
Запрос на сравнение из двух таблиц
Добрый вечер.Нужна помощь с запросом. Есть две таблицы: ШтатноеРасписание(КодОтдела,КодДолжности,КоличествоШтатныхЕдиниц)
и таблица
Сотрудники(НомерПриказа, Табельный номер,КодОтдела,КодДолжности)
Нужно написать запрос,в котором должно сравниваться КоличествоШтатныхЕдиниц с количеством записей уже имеющихся сотрудников на данной должности в данном отделе.
Количество записей вычисляю:
SELECT COUNT(Сотрудники.КодДолжности) FROM Сотрудники GROUP BY КодОтдела, КодДолжности
Каким образом сравнить полученный результат со значениями из первой таблицы? Прошу помощи(
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Запрос на сравнение данных из 2х таблиц
Не судите строго новичок в SQL Есть 2 таблицы #z и #t написал запрос на сравнение 2х таблиц по.
Сравнение двух таблиц + Бонус
Здравствуйте ! Можете помочь с проблемой. Есть две таблицы A B 100 .
Запрос с объединением двух таблиц
Подскажите где я допустил ошибку? Я вывожу одно поле из таблицы вот таким образом: SELECT.
Непростой запрос из двух таблиц
Есть одна таблица (id, id от кого, id кому, что-то). И вторая таблица с пользователями, но.
Регистрация: 06.04.2011
Сообщений: 13

Сообщение было отмечено DDr2 как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13
SELECT ШТ.КодОтдела, ШТ.КодДолжности, ШТ.КоличествоШтатныхЕдиниц, Сотр.cnt_emp AS УжеЕсть FROM ШтатноеРасписание AS ШТ LEFT JOIN ( SELECT КодОтдела, КодДолжности, COUNT(Сотрудники.КодДолжности) cnt_emp FROM Сотрудники GROUP BY КодОтдела, КодДолжности ) AS Сотр ON сотр.КодОтдела = ШТ.КодОтдела AND сотр.КодДолжности= ШТ.КодДолжности WHERE Сотр.cnt_emp <> ШТ.КоличествоШтатныхЕдиниц
Регистрация: 05.11.2016
Сообщений: 36
спасибо вам огромное)
извините за глупость,что значит команда cnt_emp?
5317 / 4253 / 1050
Регистрация: 29.08.2013
Сообщений: 26,776
Записей в блоге: 3
это не команда, это имя колонки
задается тут
COUNT(Сотрудники.КодДолжности) cnt_emp
Регистрация: 05.11.2016
Сообщений: 36
блин,точно,вот я идиотина
спасибо вам)
1113 / 758 / 183
Регистрация: 27.11.2009
Сообщений: 2,264
Сообщение от Svet0k 
1 2 3 4 5 6 7 8 9 10 11 12 13
SELECT ШТ.КодОтдела, ШТ.КодДолжности, ШТ.КоличествоШтатныхЕдиниц, Сотр.cnt_emp AS УжеЕсть FROM ШтатноеРасписание AS ШТ LEFT JOIN ( SELECT КодОтдела, КодДолжности, COUNT(Сотрудники.КодДолжности) cnt_emp FROM Сотрудники GROUP BY КодОтдела, КодДолжности ) AS Сотр ON сотр.КодОтдела = ШТ.КодОтдела AND сотр.КодДолжности= ШТ.КодДолжности WHERE Сотр.cnt_emp <> ШТ.КоличествоШтатныхЕдиниц
WHERE Сотр.cnt_emp <> ШТ.КоличествоШтатныхЕдиниц
выбрасывает из результата строки, в которых Сотр.cnt_emp IS NULL , например, из-за применения LEFT JOIN .
Таким образом, результат неотличим от полученного простым JOIN ом.
Либо применяйте INNER JOIN (просто JOIN ), либо переносите условие из WHERE в ON
Регистрация: 06.04.2011
Сообщений: 13
iap, Добрый день,
Спасибо за замечание, действительно это так
Следовало бы ещё is null указать
DDr2, более правильно будет так:
1 2 3 4 5 6 7 8 9 10 11 12 13
SELECT ШТ.КодОтдела, ШТ.КодДолжности, ШТ.КоличествоШтатныхЕдиниц, Сотр.cnt_emp AS УжеЕсть FROM ШтатноеРасписание AS ШТ LEFT JOIN ( SELECT КодОтдела, КодДолжности, COUNT(Сотрудники.КодДолжности) cnt_emp FROM Сотрудники GROUP BY КодОтдела, КодДолжности ) AS Сотр ON сотр.КодОтдела = ШТ.КодОтдела AND сотр.КодДолжности= ШТ.КодДолжности WHERE Сотр.cnt_emp <> ШТ.КоличествоШтатныхЕдиниц OR Сотр.cnt_emp IS NULL
Сотр.cnt_emp IS NULL — это в случае если в отделе нет сотрудников
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Запрос на обьединение двух таблиц
1Магазин(ID,Название,Адресс) 2Товар(ID,Название,Цена) 3 нужно придумать 3 таблицу чтобы можно.

Запрос на объединение двух таблиц
как объединить 2 таблицы ? Что бы после строк перовой таблицы, были строки второй таблицы ?
Запрос на выборку из двух таблиц
есть две таблицы таблица_разделов: id;id_parent;name_razdel таблица_товаров.
