Merge
Префикс Merge может быть добавлен к любому оператору LOAD или SELECT в скрипте для указания, что загруженная таблица должна быть объединена с другой таблицей. Он также указывает, что этот оператор следует выполнять в частичной перезагрузке.
Типичный вариант использования — вы загружаете журнал изменений и хотите использовать его для применения inserts, updates и deletes к существующей таблице.
Syntax:
Merge [only] [(SequenceNoField [, SequenceNoVar])] On ListOfKeys [Concatenate [(TableName)]] (loadstatement | selectstatement)
Во время обычной (не частичной) перезагрузки конструкция Merge LOAD будет работать как обычный оператор Load, но с дополнительной функциональностью для удаления устаревших записей и записей, отмеченных на удаление. Первое поле оператора Load должно содержать информацию об операции: Insert, Update или Delete.
Идентификатор каждой загруженной записи будет сравниваться с ранее загруженными записями, и только последняя запись (согласно порядковому номеру) будет сохранена. Если последняя запись отмечена как Delete, она не будет сохраняться.
Если используется префикс Concatenate или там уже будет существовать таблица с тем же набором полей, соответствующая таблица будет изменена. Иначе результат конструкции Merge LOAD будет сохранен в новой таблице.
Если применяется префикс Concatenate, в результирующей таблице может быть больше полей, чем в журнале изменений, используемом в качестве ввода для Merge.
Частичная перезагрузка сделает то же самое, что и полная перезагрузка. Единственная разница заключается в том, что конструкция Merge LOAD никогда не создаст новую таблицу. Там всегда существует соответствующая таблица из предыдущего выполнения скрипта, которая должна быть изменена.
Если загруженный журнал изменений является накапливаемым, то есть уже содержит ранее загруженные изменения, параметр SequenceNoVar может использоваться в предложении Where для ограничения объема входных данных. Тогда конструкция Merge LOAD может загружать только записи, в которых поле SequenceNoField больше, чем SequenceNoVar. После завершения Merge LOAD присвоит новое значение полю SequenceNoVar с максимальным значением в поле SequenceNoField.
Arguments:
Аргумент | Описание |
---|---|
only | Дополнительный классификатор, указывающий на то, что оператор следует выполнять только во время частичных перезагрузок. Его следует игнорировать во время обычных (не частичных) перезагрузок. |
SequenceNoField | Имя поля, содержащего метку времени или порядковый номер, который определяет порядок операций. |
SequenceNoVar |
Имя переменной, которой присваивается максимальное значение для SequenceNoField в объединяемой таблице. |
ListOfKeys | Список разделенных запятой имен полей, указывающих первичный ключ. |
operation | Первое поле оператора Load должно содержать операцию: Insert, Update или Delete. ‘i’, ‘u’ и ‘d’ также принимаются. |
Example: Скрипт загрузки данных
В этом примере во встроенную таблицу с именем Persons загружаются четыре строки. Затем Merge изменяет таблицу следующим образом:
- Добавляет строку Mary, 4
- Удаляет строку Steven, 3
- Присваивает число 5 строке Jake
Для переменной LastChangeDate будет установлено максимальное значение в столбце ChangeDate после выполнения Merge.
До загрузки Merge результирующая таблица выглядит следующим образом.
Name | Number |
---|---|
Jake | 3 |
Jill | 2 |
Steven | 3 |
После загрузки Merge таблица выглядит следующим образом.
ChangeDate | Name | Number |
---|---|---|
2/1/2021 | Jake | 5 |
- | Jill | 2 |
1/1/2021 | Mary | 4 |
Когда данные загружены, диалоговое окно Выполнение загрузки данных показывает выполняемые операции.
Example: Скрипт загрузки данных — частичная перезагрузка
В следующем примере аргумент Only указывает, что команда Merge будет выполняться только во время частичной перезагрузки. Обновления будут фильтроваться на основе ранее полученной переменной LastChangeDate. После завершения команды Merge переменной LastChangeDate будет присвоено максимальное значение столбца ChangeDate, обработанного во время слияния