У меня есть хранимая процедура, которая вставляет от tableA
до tableB
.Каждый раз, когда процедура выполняется (поскольку таблица A будет постоянно обновляться, поэтому при выполнении процедуры она будет добавлять отсутствующие данные в B), она будет вставлять все содержимое A
в B
независимо от того, что.
Поэтому во вставку я добавил оператор WHERE
для фильтрации «старых данных» на основе отметки времени, когда была добавлена запись (вставьте новые записи, где отметка времени с tableA
больше, чем наtableB
есть).В таблице нет уникальных идентификаторов, поэтому я застрял в том, чтобы сделать фильтр настолько безопасным, насколько это возможно, в основном единственное, что я мог бы рассмотреть, - это отметка времени.Я попробовал несколько способов обойти это, но у всех них есть свои минусы (прокомментированные в каждом блоке кода).
INSERT INTO TABLEB (VALUES)
SELECT A.VALUES
FROM A
WHERE (SELECT MAX(TIMESTAMP) FROM TABLEB) < (SELECT MAX(TIMESTAMP) FROM TABLEA)
--THIS DOESN'T EVEN WORK
INSERT INTO TABLEB (VALUES)
SELECT A.VALUES
FROM A
WHERE A.TIMESTAMP BETWEEN (SELECT MAX(TIMESTAMP) FROM TABLEB) AND (SELECT MAX(TIMESTAMP) FROM TABLEA)
--IF RUN TWICE IT WILL RUN ON RECORDS CONTAINING TIMESTAMPS WITH THOSE VALUES
INSERT INTO TABLEB (VALUES)
SELECT A.VALUES
FROM A
WHERE A.TIMESTAMP BETWEEN (SELECT MAX(TIMESTAMP) FROM TABLEB) AND (SELECT MAX(TIMESTAMP) FROM TABLEA)
AND A.TIMESTAMP <> (SELECT MAX(TIMESTAMP) FROM TABLEA)
--THIS WILL EFFECTIVELY SKIP RECORDS WITH THE TIMESTAMP FROM TABLEA BUT RUN TWICE WILL DUPLICATES THE ONES WITH TIMESTAMP FROM B
INSERT INTO TABLEB (VALUES)
SELECT A.VALUES
FROM A
WHERE A.TIMESTAMP BETWEEN (SELECT MAX(TIMESTAMP) FROM TABLEB) AND (SELECT MAX(TIMESTAMP) FROM TABLEA)
AND A.TIMESTAMP <> (SELECT MAX(TIMESTAMP) FROM TABLEA)
AND A.TIMESTAMP <> (SELECT MAX(TIMESTAMP) FROM TABLEB)
--THIS WILL SKIP DATA WITH THE TIMESTAMP FROM B
Любая помощь в логике, которую можно создать в прогоне ONCE и пропустить дублированные строки, приветствуется.