Обработка повторяющихся вставок записей по отметке времени в DB2

Используя DB2 9.7.5, у меня есть две таблицы: основная таблица и таблица импорта. Каждый час я получаю дамп данных, который вставляется в таблицу импорта. Затем я объединяю записи из таблицы импорта в основную таблицу. Чтобы различать существующие записи в основной таблице, все записи имеют отметку времени с точностью до секунды.

Обе таблицы определены как таковые:

CREATE TABLE ... (
    STATUS VARCHAR(1000) NOT NULL,
    ACTION_DATE TIMESTAMP NOT NULL
) IN SOME_TABLE_SPACE;

Перед объединением таблицы импорта с основной таблицей я удаляю существующие записи в таблице импорта.

DELETE FROM IMPORTING
WHERE (ACTION_DATE) IN
    (SELECT ACTION_DATE FROM MASTER);

Единственные записи в таблице импорта должны быть новыми, поэтому я вставляю записи из таблицы импорта в главную таблицу.

INSERT INTO MASTER (STATUS, ACTION_DATE)
SELECT STATUS, ACTION_DATE FROM IMPORTING;

Проблема, с которой я сталкиваюсь время от времени, заключается в том, что я получаю повторяющиеся записи, потому что ACTION_DATE иногда отличается до 2 секунд между мастер-таблицей и таблицей импорта.

Итак, как мне удалить записи из таблицы импорта, которые имеют смещение временной метки 2 секунды в главной таблице?


person GeekyDaddy    schedule 25.01.2018    source источник
comment
Независимо от этого, вы смотрели на оператор MERGE?   -  person data_henrik    schedule 25.01.2018
comment
@data_henrik MERGE работает на равенстве, не так ли?   -  person GeekyDaddy    schedule 25.01.2018
comment
Как определить, что они дубликаты? Есть ли суррогатный ключ или естественный ключ, который вы должны использовать для слияния?   -  person mao    schedule 25.01.2018
comment
Что бы ВЫ ни использовали для определения того, что они являются дубликатами, это должно быть тем, что использует ваш оператор Delete для их удаления из таблицы импорта.   -  person Wes H    schedule 25.01.2018
comment
@Wes H и Мао, ACTION_DATE действует как ключ, но иногда одна и та же запись дублируется, потому что ACTION_DATE отличается на несколько секунд. Я думал об использовании функции SECONDS и определить, находится ли разница в пределах 2, тогда они будут одинаковыми. Я просто не знаю, как реализовать это в удалении.   -  person GeekyDaddy    schedule 25.01.2018
comment
@GeekyDaddy никогда не будет достаточно безопасного диапазона дат. Вы смотрите на что-то еще, чтобы определить, есть ли дубликат. Иначе бы вы не знали, что разница в 2 секунды дублируется, а не является новой записью. Вам нужно использовать настоящий ключ.   -  person Wes H    schedule 25.01.2018
comment
Проблема, с которой я сталкиваюсь время от времени, заключается в том, что я получаю повторяющиеся записи, потому что ACTION_DATE иногда отличается до 2 секунд между мастер-таблицей и таблицей импорта - гм, КАК? Если в таблице импорта было time1, то в главной таблице должно быть time1, и точка. Если на то пошло, почему ты не очищаешь весь стол? Или даже с помощью отдельной таблицы импорта, если они обе выглядят так?   -  person Clockwork-Muse    schedule 26.01.2018
comment
@ Clockwork-Muse, я пытаюсь компенсировать систему, которую не разрабатывал. Данные, поступающие в таблицу импорта, находятся вне моего контроля, но я несу ответственность за обеспечение точности. Данные, поступающие в таблицу импорта, поступают из многих источников и часовых поясов. Некоторые группы будут вставлять свои данные из одного источника, а другая группа будет вставлять данные из другого. Опять вне моего контроля.   -  person GeekyDaddy    schedule 26.01.2018
comment
... хорошо, но это не меняет того факта, что ваш текущий рабочий процесс полностью очистит предыдущий набор строк. И здесь я согласен с Уэсом — вам нужен настоящий ключ. Во-первых, что произойдет, если строки образуют последовательность с интервалом между элементами в 1 секунду, где концы могут быть отделены друг от друга часами? Как определить, какой из них настоящий? Или куда их надо было разделить, если их несколько? Временная метка редко является уникальным ключом, это почти всегда атрибутивные данные об элементе.   -  person Clockwork-Muse    schedule 26.01.2018


Ответы (1)


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

INSERT INTO MASTER (STATUS, ACTION_DATE) SELECT STATUS, ACTION_DATE FROM IMPORTING I WHERE не существует (SELECT 1 FROM MASTER M, где m.ACTION_DATE = i.ACTION_DATE);

person Satya    schedule 26.01.2018
comment
Запись в основной таблице с отметкой времени «2018-01-25 13:14:43» равна записи в таблице импорта с отметкой времени «2018-01-25 13:14:42». Если бы я вставил, то запись была бы вставлена, но если бы я мог определить, что запись находится в пределах разницы во времени в 2 секунды, тогда она считалась бы такой же и не была бы вставлена. - person GeekyDaddy; 26.01.2018
comment
INSERT INTO MASTER (STATUS, ACTION_DATE) SELECT STATUS, ACTION_DATE FROM IMPORTING I WHERE не существует (SELECT 1 FROM MASTER M, где m.ACTION_DATE между i.ACTION_DATE и i.action_date + 2 секунды); - person Satya; 26.01.2018