Как сравнить две таблицы в sql
Перейти к содержимому

Как сравнить две таблицы в sql

  • автор:

Сравнение двух таблиц по содержимому в SQL

Как сравнить две одинаковые по структуре но различающиеся по содержимому таблицы.

1563389000423

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

1563390595035

В этом примере вместо отсутствующих значений получим NULL.

Запрос с использованием функции EXCEPT

SELECT * FROM test1

SELECT * FROM test2

вернет тот же результат что и запрос

SELECT * FROM test2
WHERE id NOT IN (SELECT id FROM test1)

1563391464558

В данном случае будут отображены только те строки. которые не совпадают.

Сравнение и синхронизация данных из одной или нескольких таблиц с данными из эталонной базы данных

Вы можете сравнивать данные в исходной и целевой базах данных и указывать, какие таблицы подлежат сравнению. Данные можно просматривать, чтобы принять решение о том, какие изменения следует синхронизировать. Затем можно обновить целевую базу данных для синхронизации баз данных или экспортировать скрипт обновления в редактор Transact-SQL или в файл.

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

Можно сравнивать данные в двух базах данных, но возможность задавать файлы проекта базы данных или DACPAC для сравнения отсутствуют, поскольку они не содержат данные.

В этом разделе рассматриваются следующие вопросы:

  • Руководство. Как сравнить и синхронизировать данные из двух баз данных.
  • Руководство. Как просмотреть различия данных

Требования

Если речь идет о сравнении данных в таблице или представлении, то таблица или представление в базе данных-источнике должна иметь несколько общих атрибутов с таблицей или представлением в целевой базе данных. Таблицы и представления, которые не соответствуют следующим условиям, не подлежат сравнению и не отображаются на второй странице мастера Создание сравнения данных:

  • Таблицы должны иметь совпадающие имена столбцов, имеющих совместимые типы данных. В именах таблиц, представлений и владельцев учитывается регистр.
  • Таблицы должны иметь одинаковые первичные ключи, уникальные индексы или ограничения уникальности.
  • Представления должны иметь одинаковые уникальные кластеризованные индексы.
  • Можно сравнивать таблицу с представлением, только если они имеют одинаковое имя.

Каждый объект имеет ключ или индекс, определяющий другие объекты, которым он соответствует. Каждая таблица и представление могут иметь больше одного первичного ключа, уникального индекса или ограничения уникальности. Поэтому может потребоваться указать используемые ключ, индекс или ограничение.

Общие задачи

В этом разделе приведено описание общих задач, которые поддерживают этот сценарий.

Определение параметров для управления сравниваемыми данными. При сравнении данных можно пропускать столбцы идентификаторов, отключать триггеры и внешние ключи. Можно также удалять первичные ключи, индексы и ограничения уникальности из скрипта обновления.

Сравнение данных в таблицах и при желании обновление целевой базы данных для согласования с исходной базой данных. После определения сравниваемых баз данных, исходной и целевой, а также для запуска сравнения, просмотрите результаты в окне Сравнение данных. Просмотрите не только подробные сведения о различиях, но и скрипт обновления, который используется для синхронизации данных. После выявления различий между двумя базами данных определите действие для каждого различия. Затем обновите целевую базу данных или экспортируйте скрипт обновления в редактор Transact-SQL или в файл. Экспортировать скрипт может потребоваться для того, чтобы вы или кто-то другой могли ознакомиться с ним перед применением изменений.

Описание результатов сравнения

В следующей таблице приведено описание пяти столбцов в окне Сравнение данных.

Столбец Примечания
Объект Отображает имя таблицы или представления, а также флажок, который указывает, должна ли целевая база данных быть синхронизирована при записи обновлений или экспорте скрипта обновления. Флажок недоступен в таблицах или представлениях, которые не содержат данные.
Различные записи Отображает число записей в целевой базе данных, имеющих одинаковый ключ, но не такие данные, как в исходной базе данных. В круглых скобках указано число записей, отмеченных как подлежащие обновлению при записи обновлений или экспорте скрипта обновления.
Только в исходной базе данных Отображает число записей в исходной базе данных, которые отсутствуют в целевой базе данных. В круглых скобках указано число записей, отмеченных как подлежащие добавлению при записи обновлений или экспорте скрипта обновления.
Только в целевой базе данных Отображает число записей в целевой базе данных, которые отсутствуют в исходной базе данных. В круглых скобках указано число записей, отмеченных как подлежащие удалению при записи обновлений или экспорте скрипта обновления.
Идентичные записи Отображает число записей в целевой базе данных, которые имеют тот же ключ и такие же данные, как и в исходной базе данных. Эти записи не обновляются при записи обновлений или экспорте скрипта обновления.

Детализация таблиц и представлений

После щелчка любой таблицы или представления в окне Сравнение данных в области сведений отображаются все строки, содержащиеся в таблице или представлении. Вкладки области сведений показывают разные категории («Различные записи», «Только в исходной базе данных», «Только в целевой базе данных», «Идентичные записи»). Для каждой строки предусмотрен флажок, который можно выбрать или очистить, чтобы указать, включать ли соответствующее изменение в скрипт обновления.

Запрос на сравнение из двух таблиц

Добрый вечер.Нужна помощь с запросом. Есть две таблицы: ШтатноеРасписание(КодОтдела,КодДолжности,КоличествоШтатныхЕдиниц)
и таблица
Сотрудники(НомерПриказа, Табельный номер,КодОтдела,КодДолжности)
Нужно написать запрос,в котором должно сравниваться КоличествоШтатныхЕдиниц с количеством записей уже имеющихся сотрудников на данной должности в данном отделе.
Количество записей вычисляю:

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?
5314 / 4251 / 1049
Регистрация: 29.08.2013
Сообщений: 26,764
Записей в блоге: 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 таблица_товаров.

Как сравнить две таблицы в sql

Помогите, пожалуйста!
Есть две таблицы
Tabl.jpg
Нужно сопоставить таблицы по столбцу code и cae и совпадающие строки удалить в tabl2.
В итоге в tabl2 должны остаться только уникальные значения code:
tabl2.jpg

Последний раз редактировалось Tagir93; 17.08.2017 в 14:16 .
Регистрация: 17.11.2010
Сообщений: 19,042

DELETE FROM tabl2 WHERE EXISTS(SELECT 0 FROM tabl1 WHERE tabl1.cae=tabl2.code) DELETE tabl2 FROM tabl2,tabl1 WHERE tabl1.cae=tabl2.code DELETE FROM tabl2 USING tabl2,tabl1 WHERE tabl1.cae=tabl2.code

Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Пользователь
Регистрация: 06.02.2017
Сообщений: 31
Сообщение от Аватар

DELETE FROM tabl2 WHERE EXISTS(SELECT 0 FROM tabl1 WHERE tabl1.cae=tabl2.code) DELETE tabl2 FROM tabl2,tabl1 WHERE tabl1.cae=tabl2.code DELETE FROM tabl2 USING tabl2,tabl1 WHERE tabl1.cae=tabl2.code

Выдает ошибку
#1064 — You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘DELETE tabl2 FROM tabl2, tabl1 WHERE tabl1’ at line 3

Регистрация: 09.01.2008
Сообщений: 26,238

во-первых, Вам написали три различных варианта. Вы все три проверили?

во-вторых, ваш пример не очень показателен.
поясню.
если в таблице Tabl2 будет запись
76 21 21
эту строчку нужно удалять?

а если будет запись
76 10 21
эту строчку нужно удалять?

Serge_Bliznykov
Посмотреть профиль
Найти ещё сообщения от Serge_Bliznykov

Регистрация: 20.04.2008
Сообщений: 5,510

‘DELETE tabl2 FROM tabl2,

delete FROM tabl2
программа — запись алгоритма на языке понятном транслятору
Пользователь
Регистрация: 06.02.2017
Сообщений: 31
Сообщение от Serge_Bliznykov

во-первых, Вам написали три различных варианта. Вы все три проверили?

во-вторых, ваш пример не очень показателен.
поясню.
если в таблице Tabl2 будет запись
76 21 21
эту строчку нужно удалять?

а если будет запись
76 10 21
эту строчку нужно удалять?

Прошу прощения! Сразу не врубился, все три запроса работают.
76 10 21 тоже нужно удалять, тут главное 76

Регистрация: 16.05.2012
Сообщений: 3,211

check the manual

Написано же, куда идти за ответом.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы.
Регистрация: 09.01.2008
Сообщений: 26,238
Сообщение от Sciv
Написано же, куда идти за ответом.

уже поздно.
ответ дал evg_m в пост #5

DELETE FROM tabl2 WHERE code In (SELECT cae FROM tabl1)

впрочем, это вариант явно хуже, чем

DELETE FROM `tabl2` WHERE EXISTS (SELECT 0 FROM tabl1 WHERE tabl1.cae=tabl2.code)

Последний раз редактировалось Serge_Bliznykov; 17.08.2017 в 15:09 .

Serge_Bliznykov
Посмотреть профиль
Найти ещё сообщения от Serge_Bliznykov

Регистрация: 05.06.2015
Сообщений: 2
Чем хуже?

ещё вариант
Код:

DELETE FROM tabl2 WHERE code In (SELECT cae FROM tabl1)

впрочем, это вариант явно хуже, чем
Код:

DELETE FROM `tabl2` WHERE EXISTS (SELECT 0 FROM tabl1 WHERE tabl1.cae=tabl2.code)

Регистрация: 09.01.2008
Сообщений: 26,238

имхо, в общем случае — эффективностью.

в первом случае в подзапрос попадают ВСЕ коды из таблицы tabl1
потом из них делается выборка по code

во втором случае из таблицы tabl1 выбираются только те записи, для которых есть совпадение по коду.

конечно, это просто общее замечание.
конкретно нужно смотреть план запроса в том и другом случае.
А ещё всё будет сильно зависеть от наличия индекса (как минимум обязательно должен быть индекс в tabl1 по полю cae) и от того, много ли в tabl1 есть кодов cae для которых нет соответствующих кодов code в таблице tabl2.

Serge_Bliznykov
Посмотреть профиль
Найти ещё сообщения от Serge_Bliznykov

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *