#sql #sql-server #tsql #sql-server-2012
Вопрос:
Я копирую данные из одной базы данных в другую, используя аналогичные таблицы Insert....select
.
Теперь все в порядке, но если исходная база данных что-то отредактировала, и я хочу, чтобы это было обновлено в таблице целевой базы данных, то это будет проблемой.
У меня есть несколько решений:
- Если запись существует (будет проверяться с помощью идентификатора GUID, который у нас есть), затем удалите ее и ее дочерние данные и вставьте все снова, следовательно, новые обновленные данные.
- Принимая во внимание объединение таблиц
SELECT * FROM SourceDb.dbo.Table1 UNION SELECT * FROM TargetDb.dbo.Table2
Если вы получаете записи, превышающие любую из двух таблиц, они не содержат одинаковых данных и их необходимо удалить и добавить повторно.
Но проблема в том, что у меня около 1 родительской и около 7 дочерних таблиц, поэтому для взятия и проверки с помощью union мне потребуется дополнительное кодирование.
что мне делать?
Ответ №1:
Общий запрос для проверки того, что набор A = набор B является :
A - B U B - A = ∅ (set theory)
Вы можете использовать приведенный выше запрос :
WITH TA AS (SELECT * FROM databaseA.SchemaA.TableA), TB AS (SELECT * FROM databaseB.SchemaB.TableB) SELECT * FROM TA EXCEPT SELECT * FROM TB UNION ALL SELECT * FROM TB EXCEPT SELECT * FROM TA;
Комментарии:
1. Двойное исключение-это так здорово и полезно. Я нахожу
except
, как правило, недооцененным.