Merge
Префикс Merge может быть добавлен к любому оператору LOAD или SELECT в скрипте для указания, что загруженная таблица должна быть объединена с другой таблицей. Он также указывает, что этот оператор следует выполнять в частичной перезагрузке.
Типичный вариант использования — вы загружаете журнал изменений и хотите использовать его для применения inserts, updates и deletes к существующей таблице.
Выполните частичную перезагрузку с помощью кнопки Перезагрузить. Для получения дополнительной информации см. Кнопка. Можно также использовать Qlik Engine JSON API.
Синтаксис:
Merge [only] [(SequenceNoField [, SequenceNoVar])] On ListOfKeys [Concatenate [(TableName)]] (loadstatement | selectstatement)
Аргументы:
Аргумент | Описание |
---|---|
only | Дополнительный классификатор, указывающий на то, что оператор следует выполнять только во время частичных перезагрузок. Этот оператор следует игнорировать во время обычных (не частичных) перезагрузок. |
SequenceNoField | Имя поля, содержащего метку времени или порядковый номер, который определяет порядок операций. |
SequenceNoVar |
Имя переменной, которой присваивается максимальное значение для SequenceNoField в объединяемой таблице. |
ListOfKeys | Список разделенных запятой имен полей, указывающих первичный ключ. |
Operation | Первое поле оператора Load должно содержать операцию в виде текстовой строки: Insert, Update или Delete. Также принимаются i, u и d. |
Общая функциональность
Во время обычной (не частичной) перезагрузки конструкция Merge LOAD работает как обычный оператор Load, но с дополнительной функциональностью для удаления устаревших записей и записей, отмеченных на удаление. Первое поле оператора Load должно содержать информацию об операции: Insert, Update или Delete.
Идентификатор каждой загруженной записи сравнивается с ранее загруженными записями, и только последняя запись (согласно порядковому номеру) будет сохранена. Если последняя запись отмечена как Delete, она не будет сохраняться.
Целевая таблица
Набор полей определяет, в какую таблицу будут вноситься изменения. Если таблица с таким же набором полей (кроме первого поля; операции) уже существует, это будет релевантная таблица для изменения. Также можно использовать префикс Concatenate, чтобы задать таблицу. Если целевая таблица не определена, результат конструкции Merge LOAD сохраняется в новой таблице.
Если используется префикс Concatenate, результирующая таблица содержит группу полей, соответствующую объединению существующей таблицы и входных данных для слияния. Таким образом, целевая таблица может получить больше полей, чем журнал изменений, используемый в качестве входных данных для слияния.
При частичной перезагрузке происходит то же самое, что и при полной. Единственное отличие заключается в том, что при частичной перезагрузке редко создается новая таблица. Если не использовано предложение Only, всегда существует целевая таблица с таким же набором полей от предыдущего выполнения скрипта.
Порядковый номер
Если загруженный журнал изменений является накапливаемым, то есть уже содержит ранее загруженные изменения, параметр SequenceNoVar может использоваться в предложении Where для ограничения объема входных данных. Тогда конструкция Merge LOAD может загружать только записи, в которых поле SequenceNoField больше, чем SequenceNoVar. После завершения Merge LOAD присваивает новое значение полю SequenceNoVar с максимальным значением в поле SequenceNoField.
Операции
Merge LOAD может иметь меньше полей, чем целевая таблица. При выполнении различных операций отсутствующие поля обрабатываются по-разному:
Insert: поля, отсутствующие в Merge LOAD, но существующие в целевой таблице, получают значение NULL в целевой таблице.
Delete: Отсутствующие поля не влияют на результат. релевантные записи удаляются в любом случае.
Update: поля, перечисленные в Merge LOAD, обновляются в целевой таблице. Отсутствующие поля не изменяются. Это означает, что два следующих оператора не являются идентичными:
- Merge on Key Concatenate Load 'U' as Operation, Key, F1, Null() as F2 From ...;
- Merge on Key Concatenate Load 'U' as Operation, Key, F1, Null() as F2 From ...;
Первый оператор обновляет перечисленные записи и изменяет F2 на NULL. Второй оператор не изменяет F2, но оставляет прежние значения в целевой таблице.